У меня недавно были некоторые проблемы с правильным поиском корневого пути приложения в c #. Я хочу, чтобы мои приложения использовали правильную папку в следующих случаях:
- веб-приложение в отладке (visual studio)
- веб-приложение в выпуске
- развернутое веб-приложение
- консольное приложение в отладке
- консольное приложение в выпуске
- развернутое консольное приложение
- служба Windows (действительно такая же, как консольное приложение)
А именно, это нужно мне для сборки журналов, которая используется всеми этими типами приложений. Он использует log4net, и ему нужно правильно разрешить физический путь внутри - внутри сборки журналов.
Поскольку log4net требует либо вызова BasicConfiguration.Configure, чтобы загрузить его из web.config / app.config. Проблема в том, что он не настраивает средство просмотра файлов, поэтому изменения не отслеживаются. Решение состоит в том, чтобы файл log4net.config был отдельно.
Теперь я не люблю помещать вещи в папку bin, bin / debug или bin / release, поскольку она никогда не включается в систему контроля версий. Вместо этого у меня есть папка Config в корне приложения. Таким образом, вы получите ~ \ Application \ Config \ log4net.config.
В статическом логгере есть 2 метода:
public static string GetRootPath()
{
var debugPath = string.Empty;
#if (DEBUG)
debugPath = "..\\..\\";
#endif
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, debugPath);
}
public static void Init(string loggerName)
{
LoggerName = loggerName;
XmlConfigurator.Configure(new FileInfo(Path.Combine(GetRootPath(), "Config\\log4net.config")));
}
Так что вы можете просто вызвать Logger.Init () в Application_Start или внутри Main () для консольных приложений. Это прекрасно работает для консольных приложений, но не для веб-приложений, поскольку AppDomain.CurrentDomain.BaseDirectory указывает на корень веб-приложения, а не на его папку bin (в которой также нет отладки или выпуска).
У кого-нибудь есть надежный способ определения корневого пути для всех вышеуказанных требований? Итак, что должен делать GetRootPath?
PS: я знаю, что мог бы проверить, если (HttpContext.Current! = Null) не объединить путь отладки, но должен быть более элегантный способ?