【问题标题】:Application stopped logging after using ILMerge使用 ILMerge 后应用程序停止记录
【发布时间】:2011-04-07 14:30:24
【问题描述】:

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

我不知道该怎么做。有谁知道为什么会发生这种情况?我是否误用了 ILMerge.exe? Reflector 似乎表明 New.exe 是“完整的”;我可以看到 Log4net 程序集和所有内容。

【问题讨论】:

    标签: c# .net log4net ilmerge


    【解决方案1】:

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

    【讨论】:

    • 这就是问题所在,尽管不需要 AssemblyResolve 事件(我只是在 Log4Net 的 Section 节点中更改了 Assembly 名称)。我不会去撞墙几次。 ;)
    • @codea 一个什么例子?这个问题很古老,但我似乎已经用乔尔的回答解决了这个问题。我猜我们最终还是决定不合并 log4net.dll。
    • @peacedog 很好地呼吁不合并 log4net.dll。合并它与我试图通过合并来完成的事情无关(如果用户进行升级,请确保我们所有的程序集都是最新的),因此省略 log4net.dll 效果很好。谢谢!
    【解决方案2】:

    我的直接猜测是,通过更改 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" />
    

    【讨论】:

    • 这正是发生在我身上的事。谢谢!
    【解决方案3】:

    尝试在 GAC 中注册 log4net 看看是否有帮助

    【讨论】:

    • 不能让你失望,因为这会奏效,但任何时候有人提到 GAC,我都会感到不适。 Dll 地狱 -> GAC 地狱
    • 从一个地狱到另一个地狱:D。如果你签署了程序集,GAC 会稍微好一点
    • 勉强同意:)。虽然我讨厌 VS2010,当您在 lib 文件夹中添加对强类型程序集的引用时,它知道 GAC 中存在某些内容,因此它永远不会将文件路径放入其中。当您提交代码时,CI 服务器上的构建会失败因为 dll 不在 GAC 中。啊。
    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多