强制.NET互操作使用本地COM DLL

强制.NET互操作使用本地COM DLL,.net,com-interop,dll,hp-quality-center,.net,Com Interop,Dll,Hp Quality Center,是否可以强制互操作程序集引用其关联COM DLL的本地副本 以下是场景: 我有一个.NET应用程序引用互操作程序集(interop.OTAClient.dll),它是COM dll(OTAClient.dll,它是HP质量中心的自动化API)的互操作。我对COM不是很了解,但据我所知,互操作程序集通过注册表中的GUID引用查找COM类,而不是指向特定的文件 我遇到的问题是,注册表项指向的OTAClient.dll副本会被不同版本的QC覆盖,这取决于我刚刚在浏览器中登录的QC版本,而这些dll的不

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

以下是场景:

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

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


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

帕维尔为我指出了正确的方向,因此我将以他的回答为准。为了其他人的利益,我做了以下几点:

  • 添加了对原始OTAClient.dll的引用,并让Visual Studio生成互操作库
  • 在解决方案资源管理器中的引用库上单击鼠标右键,然后单击“属性”。然后将隔离设置为True。这会导致VS生成一个清单文件,告诉您的程序在本地查找COM库,而不是在注册表中列出的库
  • 具体到我的场景-我还必须从质量中心引用WebClient.dll,并为此将隔离设置为True。这不是使用OTA API的应用程序直接使用的,而是OTAClient.dll引用的

  • 通过这种方式,您可以登录和注销与应用程序使用的版本不同的QC实例,而无需中断它。在我的例子中,我有一个本地QC实例,它是v9,用于特定于项目的自动化(出于各种原因,它大量定制以满足我们的需求,有大量空间用于屏幕截图存储等),我的应用程序连接到该实例。然而,对于手动测试,我还需要在IE中使用登录到位于别处的v9.2实例。如果我以前登录过v9.2实例,那么我必须在IE中打开v9实例,让它在再次运行我的应用程序之前重新下载控件。。。现在我不知道了

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


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

    Hi Pavel。感谢您的链接-我遵循了示例,VS按照预期为OTAClient生成了清单条目。但是,如果同样使用该DLL的浏览器应用程序上次使用了较新版本的DLL,我仍然会看到相同的症状。您是否认为OTAClient有可能拥有自己的依赖项,这些依赖项也会被更新的版本覆盖?如果是这样的话,有没有关于如何处理这个问题的建议?如果这些依赖项本身就是COM组件,这是可能的。如果是这样的话,您应该以类似的方式处理它们(以便最终得到一组自给自足的库)。