10

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

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);
         }

      }
   }
4

5 回答 5

2

如果您的所有程序集都实现了一个公共接口,那么您可以有一个属性或构造函数参数,允许您将 ILog 的本地实例传递给动态加载的程序集。

于 2008-09-25T21:33:36.287 回答
2

这个答案晚了4年,但我刚刚遇到了同样的问题。就我而言,我发现正在加载的程序集(来自与调用程序集不同的文件夹)也在加载它自己的 log4net 实例。

我通过从加载运行时程序集的文件夹中删除 log4net.dll 文件解决了这个问题。

于 2012-10-16T15:43:15.480 回答
2

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

log4net.LogManager.GetLogger("SomeLogger");
于 2008-10-09T01:44:24.027 回答
0

Something about the runtime loaded class prevents the usual one ILog per class from working. I can get a valid ILog instance, but unlike all the other instances it appears not to be configured (all the Is**Enabled flags are set to false). Perhaps the "root" logger is not accessible to the classes loaded at runtime???

于 2008-09-25T21:43:20.973 回答
0

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

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

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

于 2008-10-22T15:17:10.420 回答