2012-03-22 171 views
32

最近添加log4net.dll到我們的數據對象。我們的數據對象完全建立,但是當你試圖建立任何引用我們的數據對象,您會收到以下錯誤:如何解決「無法解決之間的衝突」錯誤?

No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily.

我發現下面thread這使我能夠獲得有關該問題的更多信息。

log4net用於我們項目中的各種事情。例如,Crystal將1.2.9安裝到GAC中。我知道infragictics使用1.2.10。

我們有一個特定的目錄 - 叫做c:\references - 我們建立了所有的dll,並且所有的應用程序都使用它來引用我們的內部dll。因此,我特別將我的數據對象中的引用設置爲版本1.2.11的c:\ references \ log4net.dll。這很奇怪,因爲在上面的錯誤消息中你沒有看到1.2.11。該DLL被引用特定版本:=真&複製本地:=真。我檢查了構建目錄& 1.2.11的log4net確實移動正確。

如果它幫助這裏有一些詳細的錯誤信息:

There was a conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". 
    No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily. 
     References which depend on "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" [C:\Windows\assembly\GAC_32\log4net\1.2.10.0__692fbea5521e1304\log4net.dll]. 
      C:\Windows\assembly\GAC_MSIL\CrystalDecisions.Shared\13.0.2000.0__692fbea5521e1304\CrystalDecisions.Shared.dll 

    References which depend on "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905" [C:\Program Files (x86)\Business Objects\Common\4.0\managed\log4net.dll].   c:\references\DBObjectAdoNet.dll 
      Project file item includes which caused reference "c:\references\DBObjectAdoNet.dll". 

更新:到目前爲止,我發現修復錯誤的唯一方法是在任何引用DBObjectAdoNet.dll參考log4net的。這對我們來說不是一個真正可用的解決方案,因爲我們整個系統中的幾乎所有內容都使用它。

第二次更新:試圖將log4net放入GAC認爲可以解決問題但仍然無法解決的問題。

第3次更新:我已經致電微軟。他們希望我使用Assembly.LoadFrom(),因爲我們在一個應用程序中創建了超過300,000個調用,並且需要爲每個調用進行反射,這會讓事情減慢很多,所以我非常非常猶豫。

我發現如果我卸載我的機器上的晶體運行時錯誤消失了,這並沒有什麼意義,因爲它唯一能做的就是從目錄中刪除log4net 1.2.10.0 GAC在.NET framework 2.0文件夾下,這應該不重要,因爲該應用程序是.NET Framework 4應用程序。

+0

'報價'我發現如果我卸載我的機器上的晶體運行時'/ quote' - 問題:**晶體運行時**?什麼**晶體運行時**? – 2012-07-05 13:32:47

+0

@Robert Crystal 11 x86 for .Net Framework 4.我認爲當我遇到問題時,x64版本也會發生同樣的情況。 – coding4fun 2012-09-28 15:58:28

+0

我在無法解決衝突的項目中添加了我想要的log4net版本的引用,並解決了此問題。 – 2016-01-22 14:41:39

回答

2

我們發現晶振運行時肯定是問題所在。如果我們卸載log4net %windir%\assembly安裝了Crystal運行時,則警告消息將消失。奇怪的是,如果我從log4net的站點安裝log4net 1.2.10到GAC,那麼警告消息不會再出現。如果任何人都可以解釋,那麼請添加到此線程。 Crystal使用自己的強名稱密鑰(公鑰標記不同)對log4net進行簽名。

解決log4net問題的關鍵是log4net是一個開源項目。這意味着我們可以簡單地使用不同的名稱從源代碼構建dll。還沒有嘗試過,但應該解決這個問題。每當我們想更新log4net時,我們都會有額外的源代碼構建步驟,但考慮到我們要更新dll的次數,這不是什麼大問題。

+6

我們嘗試了這種方法,結果令人沮喪。 CLR很高興地加載了這兩個程序集,但無法解決兩者都存在的ILog。結果,我們失去了一半的伐木量。 – 2012-10-24 22:40:44

+0

@BrendaBell對不起,它沒有爲你工作。它的工作,但當然每個人的配置將會有所不同 – coding4fun 2014-04-10 17:53:07

14

打開項目文件(C#中的.csproj或VB.NET中的.vbproj)進行編輯。

確保log4net參考是Fully Qualified Type Name,有HintPathSpecificVersion=True

<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> 
    <HintPath>..\references\log4net.dll</HintPath> 
    <SpecificVersion>True</SpecificVersion> 
</Reference> 

保存該文件並嘗試重建。

+1

感謝您的回覆。試了一下遺憾的是它沒有工作: <參考包括= 「log4net的,版本= 1.2.11.0,文化=中性公鑰= 669e0ddf0bb1aa2a,ProcessorArchitecture用於= MSIL」> C:\引用log4net.dll \ coding4fun 2012-03-23 12:32:02

+0

嘗試相反的路徑,不提供特定的版本: '<參考包含= 「log4net的」> ' – KMoraz 2012-03-23 16:20:26

+1

都能跟得上即沒有按」 t工作要麼 – coding4fun 2012-03-29 13:37:16