Корневой путь приложения - PullRequest
3 голосов
/ 28 октября 2011

У меня недавно были некоторые проблемы с правильным поиском корневого пути приложения в 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) не объединить путь отладки, но должен быть более элегантный способ?

1 Ответ

1 голос
/ 28 октября 2011

Вы можете использовать свойство CodeBase класса Assembly, чтобы определить путь к исполняемой сборке:

public static string GetRootPath()
{
    var debugPath = string.Empty;
    #if (DEBUG)
    debugPath = "..\\..\\";
    #endif
    return Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath), debugPath);
}

Обратите внимание, что для веб-приложений и служб Windows путь к файлу в формате схемы URI файла. Поэтому я использую класс Uri для преобразования пути в стандартный формат пути Windows.

Надеюсь, это поможет.

...