最後更新時間:2009-08-11下午2:30 EDT將C#結構,以COM打破了VB6應用
前幾天我張貼this question的一些很奇怪的問題。那麼,我想出了什麼是造成一臺機器上的內部版本無法在其他機器上運行的問題,甚至還提出了一個解決方法,但現在它給我留下了一個很好的具體問題:爲什麼?
要重現該問題,我創建了一個新的InteropUserControl並執行以下操作:
- 添加新
public struct MyStruct
: - 給它一個GUID和
ComVisible
屬性 - 一個
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# Translations of templates on CodeProject是我用來創建我的項目模板,而不是項目模板。 VB。NET版本會自動生成事件接口__InteropUserControl
,接口_InteropUserControl
以及一些相關屬性。這些都在C#版本中明確編碼,這就是兩者之間的所有不同。
在getMyStruct,什麼是毫秒?它應該是數據嗎? – SwDevMan81 2009-07-26 15:00:54
你能提供一個簡短但完整的複製嗎? – AnthonyWJones 2009-07-26 15:03:08
@ SwDevMan81:是的,它應該。在我的部分錯別字。它會在一秒鐘內修復。 – 2009-07-27 13:30:05