最近有个项目,主要是Winform开发,但其中会使用wpf的用户控件,其都要使用log4net进行日志记录,在编译的过程中会报如下错误:
error MC1000: 未知的生成错误“因为没有预加载,所以无法解析程序集“log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”的依赖项。在使用 ReflectionOnly API 时,必须通过 ReflectionOnlyAssemblyResolve 事件预加载或按需要加载依赖程序集。”
经排查,是因为log4net配置的问题,我日志类如下:
/**************************************************************
* 类名:Log4Allen.cs
* 描述:日志类,用于记录错误、异常、调试日志
* 创建者:Allen
* 时间:Jan 9,2016
*
* ***********************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace QACDR.Common
{
/// <summary>
/// 日志类
/// </summary>
public class Log4Allen
{
/// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t"></param>
/// <param name="ex"></param>
#region static void WriteLog(Type t, Exception ex)
public static void WriteLog(Type t, Exception ex)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
log.Error("Error", ex);
}
#endregion
/// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t"></param>
/// <param name="msg"></param>
#region static void WriteLog(Type t, string msg)
public static void WriteLog(Type t, string msg)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
log.Error(msg);
}
#endregion
}
}
问题就在于[assembly: log4net.Config.XmlConfigurator(Watch = true)],wpf编译会加载解析log4net,这样就会报错,然后就换成另外一种方式初始化log4net的配置,更改之后的方案如下:
/**************************************************************
* 类名:Log4Allen.cs
* 描述:日志类,用于记录错误、异常、调试日志
* 创建者:Allen
* 时间:Jan 9,2016
*
* ***********************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace QACDR.Common
{
/// <summary>
/// 日志类
/// </summary>
public class Log4Allen
{
/// <summary>
/// 初始化日志
/// </summary>
public static void InitLog()
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(
new System.IO.FileInfo("Config\log4net.config"));
}
/// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t"></param>
/// <param name="ex"></param>
#region static void WriteLog(Type t, Exception ex)
public static void WriteLog(Type t, Exception ex)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
log.Error("Error", ex);
}
#endregion
/// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t"></param>
/// <param name="msg"></param>
#region static void WriteLog(Type t, string msg)
public static void WriteLog(Type t, string msg)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
log.Error(msg);
}
#endregion
}
}
完美解决Winform与wpf同时使用log4net。