应用程序在使用ILMerge后停止记录

pea*_*dog 4 .net c# log4net ilmerge

我有一个非常适度的应用程序,只有一个外部程序集(log4net.dll),我想使用ILMerge.我合并了App.exe和log4net.dll,生成的可执行文件(New.exe)似乎正常工作.但是,New.exe不再记录,并且在合并之前它正在记录正常.请记住,我在测试New.exe之前复制了App.exe.config.

我不知道该怎么做.有没有人知道为什么会这样?我错误地使用了ILMerge.exe一些怎么样?Reflector似乎表明New.exe是"整体"; 我可以看到Log4net程序集和一切.

Joe*_*csy 5

我不知道log4net的内部,但我怀疑它正在寻找log4net程序集,因为你把它合并到new.exe中找不到它.解决方案是在AppDomain中为AssemblyResolve事件提供一个将log4net.dll重新映射到new.exe的函数.


Rob*_*ine 5

我的直接猜测是,通过更改log4net程序集的程序集名称,您可以以某种方式破坏它的类型解析,可能是日志配置.

请记住,您的类型名称现在不同.

这意味着类型名称如

log4net.Appender.RollingFileAppender, log4net
Run Code Online (Sandbox Code Playgroud)

现在会

log4net.Appender.RollingFileAppender, new
Run Code Online (Sandbox Code Playgroud)

(或某些)

检查您的日志记录配置,完全限定任何appender,布局模式等(基本上任何出现在config中的log4net类型名称)以指向您的新程序集.

此外,如果您的日志配置位于web.config或app.config中(而不是单独的文件),则部分定义还需要修改:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, 
    log4net" />
Run Code Online (Sandbox Code Playgroud)

会变得像

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, 
    new" />
Run Code Online (Sandbox Code Playgroud)