COM互操作不一定爲一個COM庫創建一個互操作庫。這只是類型庫導入程序的默認行爲。還可以爲一個COM庫提供一個用於多個COM庫或多個互操作程序集的互操作程序集。
互操作程序集甚至沒有鏈接到COM庫!無需在目標系統上安裝源庫,即可輕鬆部署它。實際上,只要您嘗試創建其中一個庫對象的實例,它就會失敗。當您想要查找源代碼時,interop程序集中的對象很重要。它們被稱爲運行時可調用包裝程序(運行時代表CLR)。這就是你的互操作程序集稱爲RCW.Xyz.dll
的原因。顯然,該組件的開發人員使用tlbimp的/out
開關來創建它。
當您想要搜索庫時,會定義一個特定的COM類型,只需在interop程序集中查找類名。您可以使用Visual Studio的對象瀏覽器來執行此操作 - 無需拆卸互操作程序集。這些程序集通常不會定義任何代碼。他們只提供元數據來滿足CLR。每個班級都標有ComImport
屬性和Guid
屬性。使用此GUID識別您的註冊表中的類(HKEY_CLASSES_ROOT\CLSID\{GUID}
,正如您在答案中所述)。 Inproc32
鍵的默認值是類型在其中定義的庫。請注意,這僅適用於inproc COM服務器(DLL's; COM als支持其他庫類型)。
如上所述,這實際上必須爲每個類完成。但是,如果interop程序集的開發人員使用類型庫導入程序來生成interop程序集並且未修改或將其與其他程序集進行修改或合併,則應該足以僅爲一種類型執行此操作,因爲前面提到了tlbimp的默認行爲。