申请停止使用ILMerge
之后登录我有,我想用ILMerge在一个外部组件(log4net.dll)一个很不起眼的应用程序。我合并App.exe和log4net.dll,并且生成的可执行文件(New.exe)似乎正常工作。但是,New.exe不再记录,并且在合并之前记录正确。熊我介意在测试New.exe之前,我复制了App.exe.config。申请停止使用ILMerge
我不知道怎么利用这一点。有人知道为什么会发生这种情况吗?我有没有使用ILMerge.exe一些如何?反射器似乎表明New.exe是“整体”;我可以看到Log4net程序集和一切。
我不知道的log4net的内部,但我怀疑它在寻找log4net的组装并不能找到它,因为你把它合并进new.exe 。解决方法是在AppDomain中提供一个将log4net.dll重新映射到new.exe的函数。
试图注册log4net的GAC中,看看它是否有助于
我立即猜测是,通过改变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" />
这正是我发生的事情。谢谢! – 2014-09-19 18:12:37
这就是问题所在,尽管AssemblyResolve事件不是必需的(我只是改变了Log4Net的Section节点中的程序集名称)。我不会几次把我的头靠在墙上。 ;) – peacedog 2011-04-07 16:04:28
@codea一个什么样的例子?这个问题很古老,但我似乎用乔尔的答案解决了它。我猜我们最终回去决定不合并log4net.dll。 – peacedog 2014-01-07 18:51:05
@peacedog良好的调用不合并log4net.dll。合并它与我试图通过合并来完成的任务没有关系(确保我们的所有程序集都是最新的,如果用户进行升级),因此不再需要log4net.dll。谢谢! – 2014-09-19 15:41:29