我有一个互操作DLL RCW.Xyz.dll
但我无法找到相应的DLL。 由于名称不遵循默认的命名方案Interop.Xyz.dll
我的猜测是,互操作的组件简单地重新命名。 (即使是由Visual Studio使用默认名称生成的DLL,如果DLL在其名称中的空格,空格会迷路,难以找到源DLL再次)
我怎样才能找出互操作程序集背后的COM DLL的名字吗?
我想我需要使用拆卸工具。 最好我在寻找这有效的解决方案dotPeek ,因为我没有自己的反光牌照。
我有一个互操作DLL RCW.Xyz.dll
但我无法找到相应的DLL。 由于名称不遵循默认的命名方案Interop.Xyz.dll
我的猜测是,互操作的组件简单地重新命名。 (即使是由Visual Studio使用默认名称生成的DLL,如果DLL在其名称中的空格,空格会迷路,难以找到源DLL再次)
我怎样才能找出互操作程序集背后的COM DLL的名字吗?
我想我需要使用拆卸工具。 最好我在寻找这有效的解决方案dotPeek ,因为我没有自己的反光牌照。
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的默认行为。
如果安装了DLL,这些步骤如下:
regedit.exe
,然后定位到HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32