2012-07-03 31 views

回答

3

爲什麼是的,是的。

1)需要這種Interop的一個特殊情況是當你的類需要實現一個已經存在的COM接口時。例如,SharePoint提供了一些插件體系結構,其中插件被註冊爲一個實現一些自定義接口的COM類。

如果您沒有該接口的Primary Interop Assembly,那麼您應該需要添加對TLB或包含TLB的DLL的引用。添加引用時,可以通過選擇「瀏覽」在Visual Studio中添加引用。如果你沒有TLB,你應該有一個IDL,你可以使用midl.exe編譯成TLB。某些文檔建議等效於在TLB上運行tlbimp.exe,併爲生成的程序集添加引用。

但是......

  • 在所有的可能性,如果您嘗試使用上面的方法,客戶端將成功創建類的COM對象實例,但是當他們打電話給它的任何方法會崩潰。這是因爲上述方法混淆了接口中方法的順序。所以客戶端試圖調用需要一些參數的方法A,但是虛擬表中的條目(假設客戶端是C++)實際上調用方法B!並嘗試將無效參數整理到其託管實現中。
  • 有時翻譯的參數類型不正確(例如,byte*可能會翻​​譯爲ref byte)。
  • 某些接口只是翻譯錯誤(具體而言,翻譯的ILockBytes包含RemoteReadAtRemoteWriteAt方法,而不是ReadAtWriteAt)。

所以,當你可以使用來自TLB自動生成爲起點裝配 - 你必須解決上述所有的,無論是通過修改組件或只是複製生成的代碼到源文件,然後進行必要的更改。

2)根據documentation中的建議,添加ClassInterfaceAttributeClassInterfaceType.None作爲類型。

3)建立了Any CPU架構的組件,然後在任何機器上,你想註冊 -

  • 如果您想通過32位進程註冊爲COM消費總成,其註冊使用C:\Windows\Microsoft .NET\Framework\<version>\regasm.exe
  • 如果您想通過64位進程註冊您的程序集以供COM使用,請使用C:\Windows\Microsoft .NET\Framework64\<version>\regasm.exe進行註冊。

4)剛剛運行regasm.exe不添加。NET組件連接到GAC,因此如果您未自行將組件安裝到GAC中,請務必使用參數regasm.exe

5)即使Visual Studio以管理員權限運行,如果在構建選項中選中「註冊COM互操作」複選框,程序集的註冊通常也會失敗。最好清除複選框,而是將regasm.exe作爲後期製作事件添加。

1

,我碰到的一對夫婦:

  1. COM不支持泛型因此所有的集合,它們通過COM訪問將需要非類型化的。
  2. 雖然COM支持接口繼承,但.Net實現不支持。既然COM只關心接口,你可以在你的類中使用繼承,但是你的接口必須同時包含派生類和基類成員。
相關問題