簡體   English   中英

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

[英]Force .NET interop to use local COM DLL

是否可以強制互操作程序集引用其關聯的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的這種特定情況。

帕維爾指出我正確的方向,所以我將標記他的答案。 為了其他人的利益,這就是我所做的:

  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實例並讓它重新下載控件,然后再次運行我的應用程序......現在我沒有。 :)

你想要免注冊COM

我們將Isolated屬性設置為true后,顯示Web.config如何更改的小示例將幫助其他人在將Isolated屬性設置為true時理解后面實際發生的情況。 VS實際上在代碼中輸入了幾行,因此它將使用特定CLSID的com Dll。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM