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" };
public object GetFilesName(string strDir)
{
var arrTest = Directory.GetFiles(strDir);
return Microsoft.JScript.GlobalObject.Array.ConstructArray(arrTest);