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

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.