我創建一個COM可調用.NET程序集,現在試圖從傳統的COM客戶端使用它(VB6客戶在我的情況)之間的用戶定義類型的數組。編組了VB6和.NET
大會應公開API風格的界面,所以典型的函數聲明應該是這樣的:
int myRoutine (object inParam, out object result);
問題是,當我試圖使用函數聲明爲:
int GetMultipleItems (out ItemData[] itemList);
在VB6這個翻譯函數有數組作爲參數傳遞,當我用'無效的過程調用或參數'調用它時失敗。
實際通話的樣子:
Dim items() As ItemData
result = SCServer.GetMultipleItems (items)
進一步調查,我試圖標誌着我的庫的MarshalAs屬性的幾種不同的方式。從我的角度來看,問題是參數必須被傳入並且 - 另一方面 - 要返回到VB代碼的變體。
經過多次實驗,我得到了以下的工作(1):
int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_DISPATCH)]out object[] itemList);
(有項目()聲明爲在客戶端對象)。
但我不得不使用正是我最初的簽名(2),
int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_DISPATCH)]out ItemData[] itemList);
這並不與任何對象,或在客戶端的ItemData數組類型的申報工作。
所以,問題是:
- 爲什麼(1)工作,而(2)沒有。我應該在屬性聲明或客戶改變什麼讓我在簽名實際類型的工作(它暴露已出口到TLB以及一個接口,所以似乎都應該在這裏OK)
- 什麼是推薦的方法定義sugh [OUT]參數數組
- 也許我缺少一些基本的閱讀,我將是...我仍然需要得到樣品中一兩天工作的聯繫表示感謝。
在此先感謝。
我正在考慮將此作爲選項。沒有提到的問題 - 返回值不是真正的項目計數,它包含操作錯誤。如果沒有其他辦法,你的建議仍然可能有用 – 2009-08-14 08:11:50