簡體   English   中英

對於VB6應用程序,將C#struct暴露給COM中斷

[英]Exposing C# struct to COM breaks for VB6 app

最后更新時間: 2009-08-11美國東部時間下午2:30

前幾天我張貼了這個問題的一些很奇怪的問題。 好吧,我弄清楚是什么原因導致一台機器上的構建不能在其他機器上運行甚至想出一個解決方案,但現在它給我留下了一個很好的,具體的問題:為什么?

為了重現這個問題,我創建了一個新的InteropUserControl並執行以下操作:

  1. 添加一個新的public struct MyStruct
  2. 給它一個GUID和ComVisible屬性
  3. GetMyStruct成員添加到_InteropUserControl接口並在InteropUserControl實現它。

MyStruct

[Guid("49E803EC-BED9-4a08-B42B-E0499864A169")]
[ComVisible(true)]
public struct MyStruct {
    public int mynumber;
}

_InteropUserControl.GetMyStruct()

[DispId(7)]
void getMyStruct( int num, ref MyStruct data );

(我已經嘗試返回MyStruct而不是通過引用傳遞。)

InteropUserControl.GetMyStruct()實現:

public void getMyStruct( int num, ref MyStruct data ) {
    data = new MyStruct();
    data.mynumber = num * 2;
}

我還簽署了程序集並將其安裝到GAC並注冊Regasm。 將它添加到新的VB6項目並添加對GetMyStruct()的調用並在我們的構建機器上進行編譯后,它拒絕在其他機器上運行。

為了解決這個問題,我不得不將一個類暴露給COM而不是結構,並且基本上將GetMyStruct更改為:

public void GetMyData( int num, MyClass data ) {
    data.mynumber = num * 2;
}

在我的實際項目中,我在內部檢索結構,然后將結構中的所有字段值復制到客戶端傳遞給方法的類的實例上的匹配成員。

那么為什么一個結構導致這種行為並且一個類工作正常呢? 將結構暴露給COM以便在VB6中使用是否有一些魔力?

我認為它可能與OLE自動化有關。

注意:我也嘗試返回結構而不是使用ref參數,但這並沒有改變行為。

編輯以添加項目模板的鏈接:

Interop Forms Toolkit 2.0是原始的VB.NET項目模板和dll。 我沒有引用dll,所以你可能不需要安裝它。

C#CodeProject上的模板翻譯是我用來創建我的模板(項目模板,而不是項目模板)。 VB.NET版本自動生成__InteropUserControl事件接口, _InteropUserControl接口和一些相關屬性。 這些是在C#版本中明確編碼的,這就是兩者之間的所有不同之處。

我想我找到了解決這個問題的方法。 我有同樣的問題,vb6在通過傳遞結構調用互操作庫的方法時中斷。 這是我為測試DLL互操作而創建的項目,因此我在項目中擁有的只是一個表單。 但我有另一個項目(主要應用程序)與相同的參考,它工作正常。

在閱讀Joel帖子后,我想測試他的解決方案,實際上id確實有效(使用類而不是結構)。 但我還有其他使用結構的互操作,所以我很擔心在任何時候我的應用程序都可能失敗。 另外,我不想做額外的工作來創建和公開接口和一個類來替換結構。

所以,我從我的表單中獲取代碼並將其移動到模塊中的public sub。 它立即工作。 順便說一句,這就是我在主應用程序中實現調用的方式。

我希望它可以幫助別人。

將結構暴露給COM以便在VB6中使用是否有一些魔力?

文章COM數據類型 * MSDN上說,結構支持。 具體來說,MSDN文章說COM結構定義為:

ByRef VALUETYPE< MyStruct >

在頁面底部還有一些關於自定義COM可調用包裝器的文章,您可能希望查看這些文章。

  • 編輯(2016):原始鏈接已損壞,因此我將其修復為.Net Framework的3.5版。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM