2014-02-12 35 views
1

我有一個Interop DLL RCW.Xyz.dll但我無法找到相應的DLL。由於名稱不遵循默認的命名方案Interop.Xyz.dll,我的猜測是互操作程序集只是重命名。 (即使該DLL是由Visual Studio生成的一個默認名稱,如果該DLL的名稱中有空格,這些空格將會丟失,從而很難再次找到源DLL)通過反射查找來自Interop程序集的源DLL名稱

如何查找互操作程序集後面的COM DLL名稱?

我假設我需要使用反彙編工具。最好我正在尋找解決方案,在dotPeek工作,因爲我沒有反射器許可證。

回答

0

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的默認行爲。

1

如果安裝了DLL,這些步驟如下:

  • 打開互操作組件dotPeek
  • 查找CCOMActivatorClass類和拆卸它
  • 看CCOMActivatorClass
  • 的[的Guid]屬性
  • 打開regedit.exe並導航至HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32
  • 默認值應該指向DLL
相關問題