【问题标题】:What is the best way to detect if a COM component is installed检测是否安装了 COM 组件的最佳方法是什么
【发布时间】:2009-06-09 20:56:36
【问题描述】:

我有一个 COM 互操作程序集,我想从 .NET 应用程序中检查我要创建的组件是否安装在机器上。

如果未安装,我想提供一个很好的错误消息。

将实例化放入 try-catch 对我来说不是一个好的解决方案,因为我想区分丢失的安装和可能发生的其他错误。

我的想法是检查 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface 路径下的注册表中是否存在具有 COM 类 id 的节点。但是有更好的方法吗?

【问题讨论】:

    标签: .net com


    【解决方案1】:

    不幸的是,我认为最好的方法是尝试实例化它。签入注册表并不能保证该组件确实存在(例如,该文件可能在注册后已被删除或移动)。

    【讨论】:

    • 此外,我们不应该检查注册表。它取决于实现,Microsoft 可以随时更改它。
    【解决方案2】:

    除了the problem that Eyvind mentions,在执行注册表检查时还需要考虑其他一些事项:

    • 可能(不常见,但可能)在 HKCU\Software\Classes 中有(部分)COM 注册,因此您也必须检查这一点。
    • 还有Registration-free COM,您不会在注册表中找到任何内容,但仍然可以实例化 COM 对象...

    以上都不常见,但还是要注意。

    Eyvind 的场景可能是您经常遇到的情况:有人从磁盘中删除了您的 COM 服务器而没有先取消注册。

    【讨论】:

      【解决方案3】:

      Type.GetTypeFromProgID("MyProgID") != null

      【讨论】:

      • 这听起来是个不错的解决方案。但是有没有人知道什么情况下(如果有的话)会导致得到“误报”的答案?
      • 如果 DLL 不存在或已损坏,则 GetTypeFromProgID 会成功,但实例化会失败。
      【解决方案4】:

      您还可以在 try/catch 块中实例化您想要检查的 com 类的对象,以便在 catch 块中警告您的用户。直截了当的解决方案,我同意。

      检查注册表对我来说似乎是最合理的方法,因为未注册的 com 组件毫无用处。

      【讨论】:

        【解决方案5】:

        您可以使用iTripoli Type Library Viewer - free。使用上述方法,打开有问题的EXE/DLL。然后,您会发现 GUID。打开regedit,进入KEY:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID。使用上述 GUID 搜索/查找

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 2012-11-27
          • 2018-03-03
          • 1970-01-01
          相关资源
          最近更新 更多