如何在运行时加载的程序集中使用通用的log4net参考?

时间:2020-03-06 14:45:02  来源:igfitidea点击:

我有一个单线程应用程序,使用以下命令在运行时加载多个程序集:

objDLL = Assembly.LoadFrom(strDLLs[i]);

我希望以这种方式加载的程序集与其余程序集一样使用相同的log4net.ILog参考。但是看来,运行时加载的程序集完全具有不同的引用,并且需要它们自己的配置。有谁知道单个log4net.ILog是否可以在使用.NET接口的运行时加载的程序集中使用?

这是Program类中的log4net.ILog创建和支持代码:

// Configure log4net using the .config file
   [assembly: log4net.Config.XmlConfigurator(Watch = true)]

   public static class Program
   {
      private static log4net.ILog m_Log = null;

      [STAThread]
      public static void Main(string[] args)
      {
         try
         {
            m_Log = log4net.LogManager.GetLogger(
               MethodBase.GetCurrentMethod().DeclaringType);
         }

      }
   }

解决方案

如果所有程序集都实现一个公共接口,则可以有一个属性或者构造函数参数,该参数可以使我们将ILog的本地实例传递给动态加载的程序集。

关于运行时加载的类的某些信息使每个类无法正常使用一个ILog。我可以获得一个有效的ILog实例,但是与所有其他实例不同,它似乎没有配置(所有Is ** Enabled标志都设置为false)。也许在运行时加载的类无法访问" root"记录器???

我们可以通过指定文字记录器名称字符串来获取相同的记录器,从而获得相同的记录器实例。

log4net.LogManager.GetLogger("SomeLogger");

我有一个愚蠢的解决方案。我们可以将XmlConfiguration设置为主要的log4net配置文件。

[assembly: log4net.Config.XmlConfigurator(ConfigFile="<configpath>",Watch = true)]

它不是真正的美丽..但是它运行。