我有一个互操作 DLL RCW.Xyz.dll
,但我找不到相应的 DLL。因为该名称不遵循默认命名方案Interop.Xyz.dll
,所以我猜测互操作程序集只是被重命名了。(即使 DLL 是由 Visual Studio 以默认名称生成的,如果 DLL 的名称中有空格,空格也会丢失,很难再次找到源 DLL)
如何找出互操作程序集背后的 COM DLL 名称?
我假设我需要使用反汇编工具。最好我正在寻找一种适用于dotPeek的解决方案,因为我没有 Reflector 许可证。
我有一个互操作 DLL RCW.Xyz.dll
,但我找不到相应的 DLL。因为该名称不遵循默认命名方案Interop.Xyz.dll
,所以我猜测互操作程序集只是被重命名了。(即使 DLL 是由 Visual Studio 以默认名称生成的,如果 DLL 的名称中有空格,空格也会丢失,很难再次找到源 DLL)
如何找出互操作程序集背后的 COM DLL 名称?
我假设我需要使用反汇编工具。最好我正在寻找一种适用于dotPeek的解决方案,因为我没有 Reflector 许可证。
如果已安装 DLL,请执行以下步骤:
regedit.exe
并导航到HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32
COM 互操作不一定为一个 COM 库创建一个互操作库。这只是类型库导入器的默认行为。也可以为多个 COM 库提供一个互操作程序集,或为一个 COM 库提供多个互操作程序集。
互操作程序集甚至没有链接到 COM 库!无需在目标系统上安装源库即可轻松部署。事实上,一旦您尝试创建其中一个库对象的实例,它就会失败。当您想要找到它们的源时,互操作程序集中的对象很重要。它们被称为运行时可调用包装器(运行时代表 CLR)。这就是为什么您的互操作程序集被称为RCW.Xyz.dll
. 可能该程序集的开发人员使用 tlbimp 的/out
开关来创建它。
当您要搜索库时,在其中定义了某种 COM 类型,只需在互操作程序集中找到类名即可。您可以使用 Visual Studio 的对象资源管理器来执行此操作 - 无需反汇编互操作程序集。这些程序集通常根本不定义任何代码。它们只提供满足 CLR 的元数据。每个类都标有一个ComImport
属性和一个Guid
属性。使用此 GUID 来识别注册表中的类(HKEY_CLASSES_ROOT\CLSID\{GUID}
正如您在回答中提到的那样)。键的Inproc32
默认值是定义类型的库。请注意,这仅适用于 inproc COM 服务器(DLL;COM 也支持其他库类型)。
如上所述,这实际上必须为每个类完成。但是,如果互操作程序集的开发人员使用类型库导入器来生成互操作程序集,并且没有修改或与其他类型合并,那么由于前面提到的 tlbimp 的默认行为,只对一种类型执行此操作就足够了。