過去我用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.網上這方面的中文似乎不太全,希望我寫的能帶給您協助.如您能告知,將使在下無比欣慰,謝謝!