2008-09-25 8 views
9

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

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

     } 
    } 
+0

Зачем им все они нужны, чтобы иметь тот же ILog? Вы можете иметь один ILog для каждого класса, и все они регистрируются в корневом журнале по умолчанию. – 2008-09-25 21:31:40

ответ

2

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

0

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

1

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

log4net.LogManager.GetLogger("SomeLogger"); 
0

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

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

На самом деле это не красота .. но она работает.

1

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

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

+0

OMG! Это решило мою проблему, когда регистрация динамически загружаемых сборок никогда не работала, тогда как она отлично работала при сборках, где в ссылке в проекте. – 2015-09-18 12:45:07