winform wpf 同时使用log4net出错处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform wpf 同时使用log4net出错处理相关的知识,希望对你有一定的参考价值。

 

最近有个项目,主要是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。





 

以上是关于winform wpf 同时使用log4net出错处理的主要内容,如果未能解决你的问题,请参考以下文章

【WPF高手进】WinForm中引用WPF项目出错!!!要崩溃了@@@

wpf combobox 使用总出错

c# winform httpWebResponse post出错

使用 Microsoft.Dwayne 时出错需要解决 WPF 空域问题

wpf中调用winform用户控件的方法

Log4Net的控制台,WinForm,WebApplication使用