Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序在使用ILMerge后停止日志记录_C#_.net_Log4net_Ilmerge - Fatal编程技术网

C# 应用程序在使用ILMerge后停止日志记录

C# 应用程序在使用ILMerge后停止日志记录,c#,.net,log4net,ilmerge,C#,.net,Log4net,Ilmerge,我有一个非常普通的应用程序,只有一个外部程序集(log4net.dll),我想在其上使用ILMerge。我合并了App.exe和log4net.dll,生成的可执行文件(New.exe)似乎工作正常。但是,New.exe不再记录日志,并且在合并之前记录良好。请记住,在测试New.exe之前,我复制了App.exe.config 我不知道该怎么办。有人知道为什么会这样吗?我是不是误用了ILMerge.exe?Reflector似乎表示New.exe是“完整的”;我可以看到Log4net程序集和所有

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


我不知道该怎么办。有人知道为什么会这样吗?我是不是误用了ILMerge.exe?Reflector似乎表示New.exe是“完整的”;我可以看到Log4net程序集和所有内容。

尝试在GAC中注册Log4net,看看它是否有帮助

我不知道Log4net的内部结构,但我怀疑它正在查找Log4net程序集,但由于您将其合并到new.exe中,因此找不到它。解决方法是在AppDomain中为AssemblyResolve事件提供一个将log4net.dll重新映射到new.exe的函数。

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

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

这意味着

log4net.Appender.RollingFileAppender, log4net
现在应该是

log4net.Appender.RollingFileAppender, new
(或类似情况)

检查日志配置,完全限定任何附加器、布局模式等(基本上是出现在配置中的任何log4net类型名称)以指向新程序集

此外,如果您的日志记录配置位于web.config或app.config中(与单独的文件相反),则节定义也需要修改:

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

会变成

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


这就是问题所在,尽管不需要AssemblyResolve事件(我只是在Log4Net的节节点中更改了程序集名称)。我不打算把头撞到墙上几次@代码是什么的一个例子?这个问题由来已久,但我似乎已经用乔尔的答案解决了它。我猜我们最终还是回去了,决定根本不合并log4net.dll。@peacedog不合并log4net.dll真是个好主意。合并它与我通过合并(确保用户升级时所有程序集都是最新的)试图实现的目标无关,因此省略log4net.dll效果很好。谢谢不能击倒你,因为这会起作用,但任何时候有人提到GAC,我都会感到不舒服。Dll Hell->GAC Hell从一个地狱到另一个地狱:D.使用GAC稍微好一点,但如果你签署了汇编,勉强同意:)。尽管我讨厌VS2010,它知道当您在lib文件夹中添加对强类型程序集的引用时GAC中存在某些内容,因此它从不将文件路径放入。提交代码时,CI服务器上的构建会失败,因为dll不在GAC中。这正是我所经历的。谢谢