我正在尝试编写一个旧的COM对象的包装器,并将包装器安装到GAC中。目标是自动设置组件所需的特定配置信息,并为我的所有应用程序创建一个通用的强类型接口。
到目前为止,我的解决方案是将XML配置文件保存在与原始COM DLL相同的目录中,并在类构造函数中加载配置。不幸的是,我一直无法找到已注册的COM dll的位置......
如何获取COM对象interop dll引用的COM dll的完整文件路径?
答案 0 :(得分:2)
据推测,您可以从interop DLL获取映射到COM DLL的CLSID和IID值的GuidAttribute
或CoClassAttribute
值。然后,您可以在注册表中查找相应的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;