通过反射从Interop程序集中查找源DLL名称

时间:2014-02-12 04:19:35

标签: .net com-interop disassembly reflector dotpeek

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

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

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

2 个答案:

答案 0 :(得分:1)

如果安装了DLL,则执行以下步骤:

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

答案 1 :(得分:0)

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

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

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

如上所述,实际上必须为每个班级做这件事。但是,如果互操作程序集的开发人员使用类型库导入程序来生成互操作程序集并且没有修改或将其与其他程序合并,则应该只为一种类型执行此操作,因为前面提到过tlbimp的默认行为。