Хотя я согласен с ответом Маурисио Шеффера в целом, могут быть случаи, когда DLL должна войти в систему перед основным приложением. В моем случае я реализовал класс расширения SOAP в DLL для регистрации SOAP-запросов и ответов для любой веб-службы ASMX. Поскольку расширение soap находится в DLL, которая выполняется до выполнения веб-метода, log4net должен быть настроен программно в DLL. Но каждый веб-сервис содержит свой собственный файл log4net.config, который DLL должна найти и загрузить для программной настройки log4net.
Мое решение состояло в том, чтобы добавить метод для определения местоположения работающей DLL
static public string AssemblyDirectory
{
get
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
и затем в конструкторе моей DLL для загрузки конфигурации программно
if (!log4net.LogManager.GetRepository().Configured)
{
// assume that log4net.config is located in the root web service folder
var configFileDirectory = (new DirectoryInfo(TraceExtension.AssemblyDirectory)).Parent;
var configFile = new FileInfo(configFileDirectory.FullName + "\\log4net.config");
if (!configFile.Exists)
{
throw new FileLoadException(String.Format("The configuration file {0} does not exist", configFile));
}
log4net.Config.XmlConfigurator.Configure(configFile);
}