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

Xia*_*ofu 7 .net dll com-interop hp-quality-center

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

这是场景:

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

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

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

Xia*_*ofu 10

帕维尔指出我正确的方向,所以我将标记他的答案.为了其他人的利益,这就是我所做的:

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

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