У меня есть однопоточное приложение, которое загружает несколько сборок во время выполнения, используя следующее:
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);
}
}
}





Если все ваши сборки реализуют общий интерфейс, тогда у вас может быть параметр свойства или конструктора, который позволяет передавать ваш локальный экземпляр ILog динамически загружаемым сборкам.
Что-то в загруженном классе среды выполнения мешает работе обычного одного ILog для каждого класса. Я могу получить действительный экземпляр ILog, но, в отличие от всех других экземпляров, он, похоже, не настроен (все флаги Is ** Enabled установлены в значение false). Возможно, "корневой" логгер недоступен для классов, загружаемых во время выполнения ???
Вы можете получить тот же регистратор, указав буквальную строку имени регистратора, получив таким образом тот же экземпляр регистратора.
log4net.LogManager.GetLogger("SomeLogger");
У меня глупое решение. Вы можете установить XmlConfiguration в основной файл конфигурации log4net.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "<configpath>",Watch = true)]
Это не совсем красота .. но работает.
Этот ответ пришел с опозданием на 4 года, но я столкнулся с той же проблемой. В моем случае я обнаружил, что загружаемая сборка (из другой папки, чем вызывающая сборка) также загружала свой собственный экземпляр log4net.
Я исправил проблему, удалив файл log4net.dll из папки, в которую загружалась сборка среды выполнения.
МОЙ БОГ ! Это решило мою проблему, когда регистрация в динамически загружаемых сборках никогда не работала, тогда как она работала нормально, когда сборки находились в ссылке в проекте.
Зачем вам нужно, чтобы все они имели один и тот же ILog? У вас может быть один ILog для каждого класса, и все они по умолчанию регистрируются в корневом регистраторе.