为什么log4net 1.2.10需要System.Web?

我正在以.NET Framework 4 Client Profile为目标的控制台应用程序中编写此代码。

this.container.AddFacility<LoggingFacility>(
  f => f.LogUsing(LoggerImplementation.Log4net));

运行时,它会因类型转换错误而失败。

无法从'Castle.Services.Logging.Log4netIntegration.Log4netFactory,Castle.Services.Logging.Log4netIntegration,Version = 2.5.1.0,Culture = neutral,PublicKeyToken = 407dd0808d44fbdc'转换为System.Type - 可能找不到类型

这是因为Castle.Services.Logging.log4netIntegration程序集未复制到输出文件夹。 作为仅运行时依赖项,这不会破坏构建。

查看构建过程,我发现它不是复制log4net或Castle设施程序集,因为它们依赖于System.Web,而客户端配置文件中没有该程序。 更改为标准配置文件意味着此相关性可用,并且可以添加设施。

为什么要这样做? 我在控制台应用程序中的客户端配置文件的目标是否作为服务器上的计划任务使用有什么不同?


一些appender依赖于System.Web,例如AspNetTraceAppender。 开发人员唯一可用的其他选择是将不依赖于系统内核的组件拆分为单独的组件,但这会破坏log4net的美感,因为它非常易于使用。 另外在编写log4net的时候,我不认为他们是一个客户端配置文件。

由于log4net是开源的,因此不会阻止您下载源代码并删除违规类并创建您自己的以Client Profile为中心的log4net程序集。

http://www.thecodeking.co.uk/2010/08/making-log4net-work-with-net-client.html

  • 下载log4net源代码
  • 使用Visual Studio 2010打开并升级解决方案
  • 删除System.Web项目引用
  • 从项目中排除Appender AspNetTraceAppender.cs类
  • 添加对System.Configuration的引用
  • 导航到Project - > log4net属性,然后选择应用程序选项卡
  • 将目标框架更改为.NET Framework 3.5 Client Profile
  • 选择生成选项卡,并将配置更改为调试
  • 在条件编译符号下,将其更改为NET; NET_1_0; NET_2_0;
  • 将配置更改为Release
  • 在条件编译符号下,将其更改为STRONG; NET; NET_1_0; NET_2_0;
  • 编辑AssemblyInfo.cs类并使用有效的强键更新AssemblyKeyFile属性
  • 在发布模式下编译项目并分发新程序集

  • 以下是我的想法:Log4Net使用System.Web,因为开发人员认为这是最好的选择。

    如果你不想要这个权重,可以考虑一个不需要System.Web的日志项目。 还有其他选项。

    链接地址: http://www.djcxy.com/p/7583.html

    上一篇: Why does log4net 1.2.10 require System.Web?

    下一篇: Will WPF be relevant with Windows 8?