2010-07-21 58 views
3

我們有一個引用COM +組件(用VB6編寫)的項目。這些組件通過「添加引用」添加到我們的.Net解決方案中。 這個效果很好,甚至intellisense的作品。來自.NET的參考COM +具有不同的GUID

現在,組件的接口(兼容性)被破壞,我們的.Net代碼不再工作。該組件添加了特定的GUID,該GUID不再註冊。

問題: 是否可以像我們習慣的那樣調用COM +組件(不允許反射),而不必更新.Net解決方案中的引用。例如,通過在文件名的基礎上爲COM +組件創建一個包裝器?

問候, M.

+0

當你說的接口壞了,你的意思是,他們已經改變了嗎? – 2010-07-21 11:51:37

+0

是的,界面已被破壞,但不是我需要的類。通常我們在編譯VB6組件時使用二進制兼容性。 – 2010-07-21 13:25:43

回答

3

否,.NET(以及任何本機程序)將不能夠實例化一個COM組件在不知道正確的GUID。

最好的辦法是防止組件在第一時間改變GUID,在組件項目中打開二進制兼容性,並保持接口保持兼容。一旦你打破了界面的兼容性,你就必須將組件讀入你的程序,以便創建一個新的有效參考。這不是因爲.NET愚蠢,那是因爲一旦你打破了接口兼容性,你需要重新編譯客戶端。

+0

我會選擇這個作爲答案,現在我將通過推出.Net和目標組件之間的額外組件來解決我的問題。通過這種方式,引用始終保持不變,我不必重新生成COM Interop。 – 2010-07-22 13:20:36

2

當您添加對COM對象的引用時,Visual Studio會自動爲您創建一個「Interop」。這個互操作本質上是一個包裝類,負責加載COM對象,幷包含用於進行函數調用的p-invoke語句。

如果您的COM對象正在更改 - 您可以在每次COM對象更新時重新添加引用,或者您可以自己生成Interop。

爲此,您可以使用TLBIMP工具:

TlbImp.exe "MyCOMClass.dll" /out:Interop.MyCOMClass.dll 

現在,如果你簡單地添加到Interop.MyCOMClass.dll而不是COM對象的引用,那麼如果COM oject變化,你可以簡單地用上面的語句重新生成Interop,並將其與新版本的COM對象一起分發。

+0

就是這樣,我不想重新生成COM Interop。 – 2010-07-22 13:16:35

0

這是解決方案:http://support.microsoft.com/kb/161137

  1. 複製並粘貼編譯VB6的DLL。
  2. 將擴展名更改爲DllName.cmp樣本
  3. 設置您的DLL和.cmp文件之間的二進制兼容性。當你再次編譯

VB6的DLL GUID不會改變;)

項目>屬性>編譯