申请停止使用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的函数。

+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

试图注册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

我立即猜测是,通过改变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