【问题标题】:Finding the source DLL name from Interop assembly via reflection通过反射从 Interop 程序集中查找源 DLL 名称
【发布时间】:2014-02-12 04:19:35
【问题描述】:

我有一个 Interop DLL RCW.Xyz.dll 但我找不到相应的 DLL。因为名称不遵循默认命名方案Interop.Xyz.dll,所以我猜测互操作程序集只是被重命名了。 (即使 DLL 是由 Visual Studio 以默认名称生成的,如果 DLL 的名称中有空格,空格也会丢失,很难再次找到源 DLL)

如何找出互操作程序集背后的 COM DLL 名称?

我假设我需要使用反汇编工具。最好我正在寻找一种适用于dotPeek 的解决方案,因为我没有Reflector 许可证。

【问题讨论】:

    标签: .net com-interop disassembly reflector dotpeek


    【解决方案1】:

    如果安装了 DLL,步骤如下:

    • 在 dotPeek 中打开互操作程序集
    • 找到CCOMActivatorClass类并反汇编
    • 看CCOMActivatorClass的[Guid]属性
    • 打开regedit.exe 并导航到HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32
    • 默认值应该指向 DLL

    【讨论】:

      【解决方案2】:

      COM 互操作不一定为一个 COM 库创建一个互操作库。这只是类型库导入器的默认行为。也可以为多个 COM 库提供一个互操作程序集,或为一个 COM 库提供多个互操作程序集。

      互操作程序集甚至没有链接到 COM 库!无需在目标系统上安装源库即可轻松部署。事实上,一旦您尝试创建其中一个库对象的实例,它就会失败。当您想要找到它们的源时,互操作程序集中的对象很重要。它们被称为Runtime Callable Wrappers(Runtime 代表 CLR)。这就是为什么您的互操作程序集被称为RCW.Xyz.dll 的原因。可能该程序集的开发人员使用 tlbimp 的 /out 开关来创建它。

      当您要搜索库时,在其中定义了某个 COM 类型,只需在互操作程序集中找到类名即可。您可以使用 Visual Studio 的对象资源管理器来执行此操作 - 无需反汇编互操作程序集。这些程序集通常根本不定义任何代码。它们只提供满足 CLR 的元数据。每个类都标有ComImport 属性和Guid 属性。使用此 GUID 来识别注册表中的类(HKEY_CLASSES_ROOT\CLSID\{GUID},正如您在回答中提到的那样)。 Inproc32 键的默认值是定义类型的库。请注意,这仅适用于 inproc COM 服务器(DLL;COM 也支持其他库类型)。

      如上所述,这实际上必须为每个班级完成。但是,如果互操作程序集的开发人员使用类型库导入器来生成互操作程序集,并且没有修改或与其他类型合并,那么由于前面提到的 tlbimp 的默认行为,只对一种类型执行此操作就足够了。

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        相关资源
        最近更新 更多