2009-07-29 29 views
7

是否有可能強制互操作程序集引用其關聯COM DLL的本地副本?強制.NET互操作使用本地COM DLL

這裏的情景:

我有一個.net應用程序中引用的互操作程序集(Interop.OTAClient.dll),這是一個COM DLL(OTAClient.dll,這對於自動化API的互操作惠普質量中心)。我不是很瞭解COM,但據我瞭解,互操作程序集通過註冊表中的GUID引用查找COM類,而不是指向特定的文件。

我遇到的問題是,註冊表項所指向的OTAClient.dll副本會被不同版本覆蓋,具體取決於我剛纔在瀏覽器中登錄的QC版本以及這些DLL的不同版本彼此不兼容。 .NET應用程序只會連接到特定版本的QC,所以我不能讓COM DLL以這種方式變化。

任何建議將不勝感激,因爲這種行爲真的令人不快。我在COM互操作問題上看到了其他問題,但它們似乎都是強制使用interop DLL的本地版本而不是GAC中的一個,而不是涉及實際COM DLL的特定情況。

回答

5

你想要Registration-free COM

+0

嗨帕維爾。感謝您的鏈接 - 我遵循該示例,VS按預期爲OTAClient生成清單條目。但是,如果較新版本的DLL已由使用該DLL的瀏覽器應用程序最後使用,我仍會看到相同的症狀。 您是否認爲OTAClient有可能自己的依賴關係也被更新版本覆蓋?如果是這樣,關於我如何處理這個問題的任何建議? – Xiaofu 2009-07-30 09:05:44

10

帕維爾指出我正確的方向,所以我會標記他作爲答案。對於其他人的利益,這是我做的:

  1. 添加到原始OTAClient.dll參考,讓Visual Studio中生成interop庫。
  2. 右鍵單擊解決方案資源管理器中引用的庫,然後單擊屬性。然後將隔離設置爲True。這會導致VS生成一個清單文件,告訴程序在本地查找COM庫而不是註冊表中列出的文件。
  3. 針對我的場景 - 我還必須從Quality Center引用WebClient.dll,並將其設置爲True。這不是由使用OTA API的應用程序直接使用,但似乎被OTAClient.dll引用。

通過這種方式,您可以登錄和退出QC版本,它們的版本與您應用使用的QC版本不同,不會破壞它。就我而言,我有一個當地的QC實例,它是v9並用於項目特定的自動化(出於各種原因,它大量定製以滿足我們的需求,具有大量的截圖存儲空間等),並且我的應用程序連接到這些實例。但是,對於手動測試,我還需要在IE中使用位於其他位置的v9.2實例登錄。如果我以前登錄過v9.2實例,那麼我必須在IE中打開v9實例,並讓它在再次運行我的應用程序之前重新下載控件...現在我不這樣做。 :)

1

將Isolated屬性設置爲true後,Web.config如何更改的一個小示例將有助於他人瞭解將Isolated屬性設置爲true時實際發生的情況。 VS實際上在代碼中輸入了幾行內容,所以它會使用特定CLSID的com Dll。

實際上,我確實在同一臺服務器上有兩個.Net應用程序,其中一個應用程序使用Quality center 10.0 Dll和其他升級到質量中心ALM 11.0。因此,在同一臺服務器上,我們無法註冊一個名稱相同的DLL。