2012-02-16 40 views
2

我很新,所以我很抱歉,如果我的問題沒有很好的結構或只是在錯誤的地方,等我已經很好的尋找解決方案,並嘗試了一些不同的方法,但沒有' t發現任何有效的東西....如何阻止Nhibernate log4net與現有log4net衝突?

我有一個解決方案,使用Nhibernate,因此必須使用log4net/2.0 /文件夾中的log4net V1.2.10.0。然而,我的解決方案也鏈接到其他一些解決方案,對此,我的訪問權限非常有限。這些使用相同的log4net V.1.2.10.0,但在文件夾中:log4net/1.2/

當我運行我的解決方案時,我得到此錯誤。

{"Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from HRESULT: 
0x80131040)":"log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d"} 

我試圖修改它調用的解決方案,但是每次我修改一個我儘快,因爲它試圖用另一種解決方案獲取解決方案中的錯誤,所以我必須修改另一個等等上。有太多的解決方案需要修改,而且與其他解決方案的相互依賴太多,我完全無法控制我能夠全部更改它們,以便使用log4net/2.0。

我發現了另一個問題(Referencing 2 different versions of log4net in the same solution),我認爲這個問題基本上是同一個問題,他們用綁定修改了app.config,但我似乎無法得到這個權利,因爲我仍然得到同樣的錯誤。我已經包括在我的app.config的結合是這樣的:

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="log4net" publicKeyToken="e27b8fa57f63a98d" /> 
    <codeBase version="1.2.10.0" href="2.0\log4net.dll" /> 
    </dependentAssembly> 
    <dependentAssembly> 
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821"/> 
    <codeBase version="1.2.10.0" href="1.2\log4net.dll" /> 
    </dependentAssembly> 
</assemblyBinding> 
</runtime> 

我不知道答案的另一個問題是指當它說:「你爲每個版本在項目中創建一個文件夾2 log4net。通過將文件添加到解決方案中(而不是添加引用),將每個log4net.dll放在相應的文件夾中。可以將複製設置爲輸出目錄屬性以便始終複製,以便在複製時自動將其複製到輸出文件夾你建立。「我是否需要爲解決方案引用的每個解決方案執行此操作?

理想情況下,我希望能夠對我的解決方案進行修改,僅僅意味着它不關心什麼log4net解決方案正在使用,但它們仍然可以在彼此之間傳遞日誌消息。我認爲這是可能的,所以任何幫助將非常感激。無論是那種方式或如何關閉nHibernate的記錄器,以便它不關心我使用的是什麼log4net,所以我可以繼續使用所有其他解決方案正在使用的log4net/1.2。我嘗試了各種各樣的方法來關閉它,但它似乎最終還是試圖找到log4net/2.0。

+0

對不起,剛纔意識到我沒有包括這部分。當我使用上面的綁定時,只要嘗試運行解決方案,就會收到此錯誤。 '{「無法加載文件或程序集'log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其某個依賴項。 )「:」log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 1b44e1d426115821「}'如果我不使用綁定,它會運行,直到它試圖引用另一個解決方案,然後我會得到頂部的錯誤。 – 2012-02-16 11:54:36

+2

您正在使用哪個版本的NHibernate?從3.0.0開始,NHibernate不再需要特定版本的log4net。 – cremor 2012-02-16 12:32:07

+0

別擔心,從OSS項目開始時遇到「DLL地獄」版本問題並不罕見,但值得堅持下去 – 2012-02-16 13:25:07

回答

1

你很幸運,因爲你在兩個不同的地方都有相同的DLL,這使得你的問題更容易解決。您可以簡單地進行備份,然後刪除DLL的一個引用(\ 1.2 \ version?),然後解決解決方案中的任何損壞的引用 - 這應該讓您可以編譯一個點。

您是否嘗試過NuGet?您可以添加對Log4Net的引用,然後添加對Nhibernate的引用,這會看到您已經滿足它的依賴性需求,並且不需要下載另一個對NHibernate的引用。

我建議使用NuGet的學習曲線,因爲它是一個強大的工具,應該讓你的生活在長遠的過程中更容易。

更新 請參閱我的評論關於提供您當前的文件夾結構來幫助 - incase你可以做到這一點;下面應該讓你開始。

要嘗試做到這一點使用,您可能需要將您的DLL是繞成一個更好的結構,只是直接文件引用。在解決方案內部(不是項目)在解決方案項目下創建以下文件夾結構。

\ EXTERNALREFERENCES \ log4net的\ \ NHibernate的\

移動日誌4網絡文件夾內的log4net的DLL的單個副本(並刪除其他實例),然後將所有的NHibernate的DLL的您正在使用(減去Log4Net)在NHibernate目錄中。刪除app.config中的綁定,然後遍歷每個項目,更新引用以指向外部引用中的版本。

文件的實際位置並不重要,你只需要你的代碼來引用的DLL的一個實例,然後當它建立他們都被複制到文件夾綁定。你只是遇到了問題,因爲你有兩個實例 - 當你編輯你的代碼時,等等。對於Log4Net所在的地方,NHibernate實際上並不是太困擾;它只是依賴於它,它必須在運行時進行填充。

更新2

新的Log4Net上的NuGet打破向後兼容性版本 - 見所引用的博客文章獲得更多信息。現在有一個1.2.11.0版本的Log4Net,其中包含一個與1.2.10.0不同的強名稱,使事情變得更加困難!

+0

我不太瞭解你的第一段。我只有在我的解決方案中引用了2.0版本(所以nHibernate能夠工作),但1.2版本在所有其他解決方案中被引用,並且我無法更改所有這些,因爲我沒有訪問權限對他們全部。我也會看看NuGet,但是你能解釋第一段嗎? – 2012-02-16 14:40:32

+0

我一定會推薦NuGet方法,因爲它旨在解決這些問題。但是,要嘗試使用直接引用來解決問題,請確認您只是在項目中包含DLL引用。 – 2012-02-16 15:09:33