【问题标题】:Find COM DLL path from Com Interop Assembly从 Com Interop 程序集中查找 COM DLL 路径
【发布时间】:2010-10-25 09:11:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net com


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      大概您可以从映射到 COM DLL 的 CLSID 和 IID 值的互操作 DLL 中获取 GuidAttributeCoClassAttribute 值。然后就可以在注册表中查找相应的DLL路径了。

      【讨论】:

      • 注册路径:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID \ {guid-here-xxxx-xxxxxxxx}
      • 我猜这不适用于 (MSI) 广告组件 - 因此这是一个相当脆弱的解决方案。
      • 我不确定它是否脆弱 - 在 .NET 内部的任何场景中,找到尚未安装的东西的路径都是非常困难的。
      【解决方案3】:

      如果您知道 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)

      如果有key,则表示COM组件已注册。然后查看子键InprocServer32里面的默认值

      例如

      • 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#?

      【讨论】:

        【解决方案4】:

        只需反映AddIn 类。

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

        【讨论】:

          猜你喜欢
          • 2011-10-12
          • 2014-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          相关资源
          最近更新 更多