2011-05-26 99 views
10

不知怎的,我很幸運,從來沒有來處理這個問題,儘管我認爲這是一個常見的一種:使用不同版本的參考DLL

我有一個web項目,姑且稱之爲SomeProjectSomeProject有一個第三方庫的參考,我們稱它爲SomeThirdParty,版本1.0。 SomeProject也有一個本土類圖書館的參考,我們稱之爲SomeLibrarySomeLibrary也有參考SomeThirdParty,但是不同的版本(比如說2.0)。

版本1.0和2.0的SomeThirdParty共享大部分相同的簽名,但是是不同的實現。如果可能的話,我需要SomeProject才能使用1.0實現,而SomeLibrary才能使用2.0實現。

我使用其對log4net的引用編譯SomeProject。結束於bin目錄的DLL是SomeProject引用的DLL。在運行時,從SomeLibrary運行的代碼,它試圖從SomeThirdParty 2.0版本執行代碼,當然失敗時,拋出一個FileLoadException: Could not load file or assembly ' SomeThirdParty , Version=2.0.0.0, Culture=[etc.]' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.

很顯然,我可以升級SomeProject到較新的DLL或降級SomeLibrary到舊DLL,但是由於許多原因它不是理想的。

我認爲正確的答案涉及在GAC中安裝SomeThirdParty,但我不確定如何去做這件事,以及它會如何影響其他開發人員和服務器。

任何建議,你可能有讚賞。

感謝您的幫助。

回答

6

將SomeThirdParty的兩個版本放入GAC都應該做你想做的事。使用gacutil實用程序或開始 - >運行 - >程序集,然後拖放。

+2

這就是我的想法。我真的不想走這條路,因爲這意味着我們的所有開發人員的機器,所有的服務器和任何新來的開發人員都會在GAC中安裝這些程序集。但是如果我們找不到替代品,我會牢記這一點。謝謝。 – 2011-05-26 16:44:12

3

從我的回答早些時候:https://stackoverflow.com/a/19576769/2367343

我使用Oracle.DataAccess.dll就遇到了這個昨天的Visual Studio Web開發人員。

我的解決辦法,

右鍵單擊您的項目(* .csproj的),並對其進行編輯。

正下方:

<PropertyGroup> 

廣場

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> 

然後重建您的解決方案。包含它們時必須將兩個版本dll分離到項目中的兩個不同目錄(必需)。

我做

ora11 >> Oracle.DataAccess.dll (Version 11) 

ora9 >> Oracle.DataAccess.dll (Version 9) 

這樣做可以讓你的IDE使用的DLL的兩個版本。