C# 如何生成SafeArray(VBarray) 以及Javascript Array.

过去我用VC写的WebBrowser和JS交互时,遇到需要传递数组时, 总是使用SafeArray , 就是VBarray .

 

尽管我知道可以通过接口直接创建 JS array , 但是我们都知道vc 实现还是很麻烦,很琐碎, 所以一直用SafeArray.

现在用c#写的时候,就遇到问题了.

我的一个IExternal接口中的函数无法传递 SafeArray .

我刚开始代码是这样的:

 

    [return: MarshalAs(UnmanagedType.SafeArray , SafeArraySubType=VarEnum.VT_BSTR )]

 public string[] GetFilesName(string strDir)

 {

        return Directory.GetFiles(strDir) ;

 }

 

看上去没什么问题.

但是JS脚本运行时弹出错误 Type mismatch.

然后我把 SafeArraySubType 这个参数换了很多个 . 始终是Type mismatch.

国内似乎没有人能提出,或是解决这个问题.

国外到有一个,大家可以看看:http://www.eggheadcafe.com/forumarchives/NETFrameworkinterop/Dec2005/post25276812.asp

里面解决了问题.

解决方法:

如何返回SafeArray (VBarray)

实际上如果你直接返回一个object[] , 因为你设置了ComVisble(true) , c#自动把object[]返回值设定为SafeArray

所以你直接这样写:

 public object[] GetFilesName(string strDir)

 {

        return new object[]{ "string1" , "string2" };

 }

js会识别为VBarray.

你也可以标准一点,这样写:

 [return: MarshalAs(UnmanagedType.SafeArray , SafeArraySubType=VarEnum.VT_VARIANT  )]

 public object[] GetFilesName(string strDir)

 {

        return new object[]{ "string1" , "string2" };

}
p.s: 实际上的实现是这样的: 使用ConvertAll把String[]转换为Object[]
 [return: MarshalAs(UnmanagedType.SafeArray , SafeArraySubType=VarEnum.VT_VARIANT  )]
     public object[] GetFilesName(string strDir)
    {
        var arrTest = Directory.GetFiles(strDir);    
        object[]  arrOb = Array.ConvertAll( arrTest, new Converter<string, object>(String2Object));    
        return arrOb ; 
    }
    private object  String2Object( string str )
    {
    return (object) str  ;
    }
如何返回Js Array:
你必须首先在C#中添加引用 Microsoft.JScript 
然后你只需要这样干:

 public object GetFilesName(string strDir)

 {

var arrTest = Directory.GetFiles(strDir); 

        return Microsoft.JScript.GlobalObject.Array.ConstructArray(arrTest);

}
注意函数返回的是一个object对象,而不是object[].
这样Js调用该函数直接返回JsArray. 而不需要从VBArray转换到JsArray.
网上这方面的中文似乎不太全,希望我写的能带给您帮助.
如您能告知,将使在下无比欣慰,谢谢!

 

posted on 2009-12-21 19:27  norsd  阅读(384)  评论(0编辑  收藏  举报

导航