Как использовать общую ссылку log4net в сборках, загружаемых во время выполнения? - PullRequest
10 голосов
/ 26 сентября 2008

У меня есть однопоточное приложение, которое загружает несколько сборок во время выполнения, используя следующее:

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

Я бы хотел, чтобы сборки, загруженные таким образом, использовали ту же ссылку log4net.ILog, что и остальные сборки. Но, похоже, загруженные сборки во время выполнения имеют совершенно другую ссылку и нуждаются в собственной конфигурации. Кто-нибудь знает, можно ли использовать один log4net.ILog для сборок, загруженных во время выполнения с использованием интерфейса .NET?

Вот код создания и поддержки log4net.ILog в классе Program:

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

      }
   }

Ответы [ 5 ]

2 голосов
/ 09 октября 2008

Вы можете получить тот же регистратор, указав буквальную строку имени регистратора, таким образом получив тот же экземпляр регистратора.

log4net.LogManager.GetLogger("SomeLogger");
2 голосов
/ 26 сентября 2008

Если все ваши сборки реализуют общий интерфейс, то у вас может быть свойство или параметр конструктора, который позволяет передавать локальный экземпляр ILog динамически загружаемым сборкам.

1 голос
/ 16 октября 2012

Этот ответ приходит на 4 года позже, но я только что столкнулся с той же проблемой. В моем случае я обнаружил, что загружаемая сборка (из другой папки, чем вызывающая сборка) также загружает свой собственный экземпляр log4net.

Я исправил проблему, удалив файл log4net.dll из папки, в которую загружалась сборка времени выполнения.

0 голосов
/ 22 октября 2008

У меня есть глупое решение. Вы можете установить XmlConfiguration в основной файл конфигурации log4net.

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

Это не совсем красота ... но она бежит.

0 голосов
/ 26 сентября 2008

Что-то в загруженном во время выполнения классе не позволяет работать обычному ILog на класс. Я могу получить действительный экземпляр ILog, но, в отличие от всех других экземпляров, он не настроен (все флаги Is ** Enabled установлены в false). Возможно, «корневой» логгер не доступен для классов, загруженных во время выполнения ???

...