【问题标题】:Force .NET interop to use local COM DLL强制 .NET 互操作使用本地 COM DLL
【发布时间】:2010-11-14 23:45:39
【问题描述】:

是否可以强制互操作程序集引用其关联 COM DLL 的本地副本?

这是场景:

我有一个引用互操作程序集 (Interop.OTAClient.dll) 的 .NET 应用程序,它是 COM DLL 的互操作程序 (OTAClient.dll,它是 HP Quality Center 的自动化 API)。我对 COM 不是很了解,但据我了解,互操作程序集通过注册表中的 GUID 引用查找 COM 类,而不是指向特定文件。

我遇到的问题是注册表项指向的 OTAClient.dll 副本被不同版本覆盖,具体取决于我刚刚在浏览器中登录的 QC 版本,并且这些 DLL 的不同版本是彼此不兼容。 .NET 应用程序只会连接到特定版本的 QC,所以我不能让 COM DLL 以这种方式变化。

任何建议都将不胜感激,因为这种行为真的很烦人。我已经看到有关 COM 互操作问题的其他问题,但它们似乎都是关于强制使用互操作 DLL 的本地版本而不是 GAC 中的一个,而不是这种涉及实际 COM DLL 的特定场景。

【问题讨论】:

    标签: .net com-interop dll hp-quality-center


    【解决方案1】:

    一个小例子展示了在我们将隔离属性设置为 true 后 Web.config 如何更改,这将有助于其他人理解当我们将隔离属性设置为 true 时实际发生的情况。 VS 实际上在您的代码中输入了几行代码,因此它将使用特定 CLSID 的 com Dll。

    实际上,我在同一台服务器上确实有两个 .Net 应用程序,其中一个应用程序使用 Quality center 10.0 Dll,其他应用程序升级到 quality center ALM 11.0。所以在同一台服务器上我们不能注册同名的DLL。

    【讨论】:

      【解决方案2】:

      Pavel 为我指出了正确的方向,因此我将他标记为答案。为了其他人的利益,这就是我所做的:

      1. 添加了对原始 OTAClient.dll 的引用,并让 Visual Studio 生成互操作库。
      2. 在解决方案资源管理器中右键单击引用的库,然后单击属性。然后将隔离设置为真。这会导致 VS 生成一个清单文件,告诉您的程序在本地查找您的 COM 库,而不是在注册表中列出的那个。
      3. 特定于我的场景 - 我还必须从 Quality Center 引用 WebClient.dll 并将隔离设置为 True。这不是由使用 OTA API 的应用直接使用的,但似乎被 OTAClient.dll 引用。

      这样,您可以登录和退出与您的应用使用的版本不同的 QC 实例,而不会破坏它。就我而言,我有一个本地 QC 实例,它是 v9,用于特定于项目的自动化(由于各种原因,它经过大量定制以满足我们的需求,有大量空间用于屏幕截图存储等),并且我的应用程序连接到该实例。但是,对于手动测试,我还需要使用 IE 登录到位于其他地方的 v9.2 实例。如果我之前登录到 v9.2 实例,那么我将不得不在 IE 中打开 v9 实例并让它重新下载控件,然后再运行我的应用程序......现在我没有。 :)

      【讨论】:

        【解决方案3】:

        你想要Registration-free COM

        【讨论】:

        • 嗨,帕维尔。感谢您的链接 - 我按照示例进行操作,VS 按预期生成了 OTAClient 的清单条目。但是,如果也使用该 DLL 的浏览器应用程序最后使用了较新版本的 DLL,我仍然会看到相同的症状。您是否认为 OTAClient 有可能有自己的依赖项也被新版本覆盖?如果是这样,对我如何处理有什么建议吗?
        • 如果这些依赖项本身就是 COM 组件,则有可能。如果是这样,您应该以类似的方式处理它们(这样您最终会得到一组自给自足的库)。
        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 2010-12-24
        • 1970-01-01
        相关资源
        最近更新 更多