2009-07-25 42 views
4

最後更新時間:2009-08-11下午2:30 EDT將C#結構,以COM打破了VB6應用

前幾天我張貼this question的一些很奇怪的問題。那麼,我想出了什麼是造成一臺機器上的內部版本無法在其他機器上運行的問題,甚至還提出了一個解決方法,但現在它給我留下了一個很好的具體問題:爲什麼?

要重現該問題,我創建了一個新的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# Translations of templates on CodeProject是我用來創建我的項目模板,而不是項目模板。 VB。NET版本會自動生成事件接口__InteropUserControl,接口_InteropUserControl以及一些相關屬性。這些都在C#版本中明確編碼,這就是兩者之間的所有不同。

+1

在getMyStruct,什麼是毫秒?它應該是數據嗎? – SwDevMan81 2009-07-26 15:00:54

+1

你能提供一個簡短但完整的複製嗎? – AnthonyWJones 2009-07-26 15:03:08

+0

@ SwDevMan81:是的,它應該。在我的部分錯別字。它會在一秒鐘內修復。 – 2009-07-27 13:30:05

回答

2

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

閱讀喬爾文章後,我想測試他的解決方案,並在事實上ID沒有工作(使用類,而不是一個結構)。但是我有其他的使用結構的interop,所以我很擔心我的應用程序在任何時候都可能失敗。此外,我不想做額外的工作來創建和暴露接口和類來替換結構。

所以,我把代碼從我的形式,並將其移動到一個公共子一個模塊中。它立即工作。順便說一下,這就是我在主應用程序中實現了通話的過程,這個應用程序工作正常。

我希望這可以幫助別人。

1

是否有一些魔力揭露一個 結構到COM在VB6中使用?

文章COM Data Types * MSDN上說,結構支持。具體來說,MSDN文章說,作爲COM結構的定義:

ByRef VALUETYPE<MyStruct> 

也有一對夫婦在頁面底部的[用戶COM可調用的包裝物品,您不妨審查這些。

  • 編輯(2016):原始鏈接已損壞,所以我將其修正爲.Net Framework 3.5版。