让 Log4Net 与 .NET 客户端配置文件一起工作






4.94/5 (17投票s)
一步一步指导,让 Log4Net 与 .NET 客户端配置文件一起工作
背景
我最近一直在开发一个针对 Microsoft .NET Framework 4 客户端配置文件的桌面应用程序,在使用 log4net 时遇到问题。问题在于 .NET 客户端配置文件不包含 log4net 程序集所需的任何 Web 相关程序集,特别是对于 AspNetTraceAppender
类。
结果是,C# 编译器无法解析 log4net 引用,这导致“找不到引用”的编译器错误。在使用 Visual Studio 时,似乎它无法在构建项目时找到 log4net DLL,但实际上这是由于缺少依赖项引起的。显示的错误如下
Error 1 The type or namespace name 'log4net' could not be found
(are you missing a using directive or an assembly reference?)
针对此问题已经有一些公开的工单(LOG4NET-174,LOG4NET-233),但没有迹象表明何时(或是否)会解决此问题。
解决方案
幸运的是,log4net 是开源的,解决方案相对简单,虽然可能并不完全显而易见。以下步骤将允许您构建一个可以与针对 3.5 或 4 客户端配置文件的应用程序一起工作的 log4net 的自定义版本。
- 下载 log4net 源代码
- 使用 Visual Studio 2010 打开并升级解决方案
- 删除
System.Web
项目引用 - 从项目中排除 Appender\AspNetTraceAppender.cs 类
- 添加对
System.Configuration
的引用 - 导航到 项目 -> log4net 属性,并选择“应用程序”选项卡
- 将目标框架更改为 .NET Framework 3.5 客户端配置文件
- 选择“生成”选项卡,并将配置更改为“调试”
- 在条件编译符号下,将其更改为 NET;NET_1_0;NET_2_0;
- 将配置更改为“发布”
- 在条件编译符号下,将其更改为 STRONG;NET;NET_1_0;NET_2_0;
- 编辑 AssemblyInfo.cs 类,并使用有效的强密钥更新 AssemblyKeyFile 属性
- 以发布模式编译项目并分发新的程序集
请注意,log4net 必须编译为 3.5 客户端配置文件,而不是 4 客户端配置文件。这允许程序集与框架的这两个版本正确工作。由于某种原因,编译为 4 会导致框架内部出现运行时错误,而我没有时间解决。
为了方便起见,我通过此页面提供了一个为客户端配置文件编译的 log4net DLL 版本,但请注意,强名称与官方版本不匹配。