2013-01-09 73 views
28

我正在通過COM interop公開一些.NET API的產品。作爲構建的一部分,我們爲所有這些程序集生成* .tlb文件,並將它們作爲單獨的SDK包的一部分提供。我們的客戶可以在我們的產品上安裝SDK,並創建使用我們的COM API的應用程序。* .tlb文件曾經在運行時使用過嗎?

我們是否需要將這些* .tlb文件與產品本身一起發貨和註冊?在運行時需要* .tlb時,是否執行了針對它們編碼的第三方庫?

請解釋它是如何工作的,如果你回答是的。我在互聯網上看到很多評論說我必須提供並註冊它們,但是我沒有找到明確解釋爲什麼應該完成的評論。這讓我懷疑這是真的。

回答

28

是的,這是可能的。特別是在.NET的情況下,您不應該忽略註冊類型庫,因爲您無法預測客戶端代碼將如何使用您的服務器。

他們不是特別常見,但有兩種情況:

  • 當客戶端代碼調用您的[標記有ComVisible特性]方法和呼叫跨越公寓邊界。公寓是一個COM概念,有點模糊,你必須瞭解STA和MTA線程之間的區別。保持簡單:當通過另一個線程,另一個進程或另一臺機器進行調用時,通常會跨越公寓邊界。 COM需要幫助來弄清楚如何將調用的參數序列化爲IPC數據包,並且需要知道參數的類型。在COM中沒有Reflection的概念,因此不能自動完成。需要一個獨立的DLL來實現代理和存根,幾乎總是從IDL文件生成的。在.NET中這很難實現,您幾乎總是使用方便的第二種方式,使用內置於Windows中的標準編組器。它使用類型庫來找出參數類型。 Regasm.exe/tlb選項可確保接口代理/存根和類型庫已註冊,因此標準編組人員可以找到該庫。

  • 當您在公共接口中公開結構時。互操作場景中的結構非常麻煩,它們的佈局高度依賴於編譯器設置。等效的.NET屬性是StructLayout.Pack。在.NET中固定爲8,但客戶端代碼不知道。要訪問結構,客戶端代碼必須使用IRecordInfo。它可以讓它找出結構的每個字段在內存中的位置。類型庫提供IRecordInfo需要的信息。最好避免在.NET中完全且非常容易地完成結構。

+0

謝謝你這就是我要找的。 – Dennis

+1

Microsoft文檔證實了這一點: http://msdn.microsoft.com/en-us/library/eaw10et3.aspx#marshaling_and_com_apartments 「接受跨公寓編組的開銷,這隻在有很多調用時才顯着跨越邊界。您必須註冊COM組件的類型庫才能成功通過公寓邊界。「 – Dennis

+1

http://msdn.microsoft.com/en-us/library/windows/desktop/ms692621(v=vs.85)。aspx 「除了使用MIDL爲自定義接口生成代理和存根外,還可以生成類型庫,而系統提供的類型庫驅動的封送處理引擎將編組接口。」 – Dennis

0

我在註冊.NET組件中使用的.dll文件時遇到了一個問題:.tlb引用。

因此,您不需要註冊.Net dll(.tlb項目)。

我希望它能工作。

相關問題