通过反射从互操作组件找到源DLL名称(Finding the source DLL name fro

2019-10-19 07:48发布

我有一个互操作DLL RCW.Xyz.dll但我无法找到相应的DLL。 由于名称不遵循默认的命名方案Interop.Xyz.dll我的猜测是,互操作的组件简单地重新命名。 (即使是由Visual Studio使用默认名称生成的DLL,如果DLL在其名称中的空格,空格会迷路,难以找到源DLL再次)

我怎样才能找出互操作程序集背后的COM DLL的名字吗?

我想我需要使用拆卸工具。 最好我在寻找这有效的解决方案dotPeek ,因为我没有自己的反光牌照。

Answer 1:

COM互操作并不一定创造一个COM库中的一个互操作库。 这仅仅是类型库导入的默认行为。 另外,也可以为多个COM库或用于一个COM库中的多个互操作组件提供一个互操作组件。

互操作程序集甚至没有链接到一个COM库! 它可以轻松地部署,而不安装在目标系统上的源库。 事实上,它会为你要创建的库对象的一个​​实例作为很快失效。 当你想找出其根源互操作程序集内的对象是很重要的。 他们被称为运行时可调用包装 (运行时表示的CLR)。 这就是为什么你的互操作程序集被称为原因RCW.Xyz.dll 。 Propably组件的开发者使用TLBIMP的/out开关来创建它。

当你想搜索的图书馆,有一定的COM类型定义的,只要找到互操作的组件内部的类名。 您可以使用Visual Studio的对象资源管理器要做到这一点 - 无需dissassemble interop程序集。 这些组件通常不会在所有定义的任何代码。 他们只提供元数据,以满足CLR。 每个类都标有ComImport属性和Guid属性。 使用该GUID,以确定您的注册表(内部类HKEY_CLASSES_ROOT\CLSID\{GUID}正如你在你的答案中提到)。 该Inproc32键的默认值是该类型是在定义的库请注意,这仅适用于INPROC COM服务器(DLL的; COM ALS支持其他库类型)。

正如上面提到的,这实际上必须为每个类完成。 但是,如果互操作程序集的开发者所使用的类型库导入到生成interop程序集,并没有与其他人修改或合并,它应该足够多只为一种类型的做,因为前面提到TLBIMP的默认行为。



Answer 2:

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

  • 打开dotPeek互操作程序集
  • 查找CCOMActivatorClass类和拆解
  • 看看CCOMActivatorClass的[的Guid]属性
  • 打开regedit.exe ,然后定位到HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32
  • 默认值应指向DLL


文章来源: Finding the source DLL name from Interop assembly via reflection