2011-04-07 79 views
4

之後登錄我有,我想用ILMerge在一個外部組件(log4net.dll)一個很不起眼的應用程序。我合併App.exe和log4net.dll,並且生成的可執行文件(New.exe)似乎正常工作。但是,New.exe不再記錄,並且在合併之前記錄正確。熊我介意在測試New.exe之前,我複製了App.exe.config。申請停止使用ILMerge

我不知道怎麼利用這一點。有人知道爲什麼會發生這種情況嗎?我有沒有使用ILMerge.exe一些如何?反射器似乎表明New.exe是「整體」;我可以看到Log4net程序集和一切。

回答

5

我不知道的log4net的內部,但我懷疑它在尋找log4net的組裝並不能找到它,因爲你把它合併進new.exe 。解決方法是在AppDomain中提供一個將log4net.dll重新映射到new.exe的函數。

+0

這就是問題所在,儘管AssemblyResolve事件不是必需的(我只是改變了Log4Net的Section節點中的程序集名稱)。我不會幾次把我的頭靠在牆上。 ;) – peacedog 2011-04-07 16:04:28

+1

@codea一個什麼樣的例子?這個問題很古老,但我似乎用喬爾的答案解決了它。我猜我們最終回去決定不合並log4net.dll。 – peacedog 2014-01-07 18:51:05

+0

@peacedog良好的調用不合並log4net.dll。合併它與我試圖通過合併來完成的任務沒有關係(確保我們的所有程序集都是最新的,如果用戶進行升級),因此不再需要log4net.dll。謝謝! – 2014-09-19 15:41:29

0

試圖註冊log4net的GAC中,看看它是否有助於

+0

不能擊倒你,因爲這會工作,但任何時候任何人都提到了GAC我很難受。 Dll地獄 - > GAC地獄 – Bronumski 2011-06-15 15:07:48

+0

從一個地獄到另一個:D。 GAC略好,但如果你簽署了程序集 – 2011-06-15 15:18:54

+1

勉強同意:)。雖然我討厭VS2010它知道的東西是在GAC,當你在你的lib文件夾添加到一個強類型的程序集的引用,因此決不會使路徑的文件,當你提交你的代碼生成的CI服務器上失敗因爲該dll不在GAC中。 Aggghhh。 – Bronumski 2011-06-15 15:28:12

4

我立即猜測是,通過改變log4net的組件的組裝名字,你不知何故破它的類型解析,可能是日誌配置。

記住,你的類型名現在是不同的。

這意味着,如

log4net.Appender.RollingFileAppender, log4net 
類型名稱

現在是

log4net.Appender.RollingFileAppender, new 

(或諸如此類)

檢查你的日誌記錄配置,完全限定任何追加程序,佈局模式, etc(基本上任何出現在配置中的log4net類型名稱)指向你的新程序集。

此外,如果你的日誌記錄配置,那麼在你的web.config或app.config中(而不是一個單獨的文件),那麼部分的定義也需要修改:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, 
    log4net" /> 

會成爲像

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, 
    new" /> 
+0

這正是我發生的事情。謝謝! – 2014-09-19 18:12:37