从Com Interop Assembly中查找COM DLL路径

时间:2009-05-11 19:39:12

标签: c# .net com

我正在尝试编写一个旧的COM对象的包装器,并将包装器安装到GAC中。目标是自动设置组件所需的特定配置信息,并为我的所有应用程序创建一个通用的强类型接口。

到目前为止,我的解决方案是将XML配置文件保存在与原始COM DLL相同的目录中,并在类构造函数中加载配置。不幸的是,我一直无法找到已注册的COM dll的位置......

如何获取COM对象interop dll引用的COM dll的完整文件路径?

4 个答案:

答案 0 :(得分:2)

据推测,您可以从interop DLL获取映射到COM DLL的CLSID和IID值的GuidAttributeCoClassAttribute值。然后,您可以在注册表中查找相应的DLL路径。

答案 1 :(得分:2)

从相应的COM服务器创建对象后,必须已加载其DLL。假设底层COM服务器是在“mycomserver.dll”中实现的,您可以使用P / Invoke并调用GetModuleHandle(“mycomserver.dll”) - 这将为您提供DLL的路径。

答案 2 :(得分:1)

如果您知道COM dll的CLSID,则可以检查HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}上是否存在具有该CLSID的密钥(Wow6432Node => 64位上注册的32位COM机)

如果密钥在那里,则表示COM组件已注册。然后查看子键InprocServer32

中的默认值

e.g。

  • HKEY_CLASSES_ROOT\CLSID\{12345678-9012-3456-7890-123456789012}\InprocServer32
  • HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{12345678-9012-3456-7890-123456789012}\InprocServer32

如果有帮助,以下是如何使用C#打开这些密钥的参考示例(您只需检查InprocServer32中的值):How to check COM dll is registered or not with C#?

答案 3 :(得分:-1)

只需反映AddIn课程即可。

var t = typeof(ThisAddIn);
var path = t.Assembly.CodeBase;