Кореневий шлях програми

Я нещодавно мав деякі проблеми з коректним відкриттям кореневого шляху програми в c #. Я хочу, щоб мої програми використовували правильну папку в наступних випадках:

  • веб-додаток для налагодження (візуальна студія)
  • веб-додаток у версії
  • розгорнуте веб-додаток
  • консольний додаток у налагодженні
  • консольний додаток у версії
  • розгорнута консольна програма
  • служба Windows (така ж, як консольне додаток)

А саме, це потрібно для збирання журналів, який використовується для всіх типів програм. Він використовує протокол log4net, і він повинен правильно вирішувати фізичний шлях всередині - всередині збирання журналів.

Оскільки протоколу log4net потрібен або виклик до BasicConfiguration.Configure для завантаження з web.config/app.config. Проблема з цим полягає в тому, що він не встановлює переглядач файлів, тому зміни не відстежуються. Рішення - мати файл log4net.config окремо.

Тепер мені не подобається розміщувати речі всередині кошика, папки 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 вказує на корінь веб-додатки, а не на папку біна (яка також не має налагодження чи випуску).

Хто-небудь має надійний спосіб вирішення кореневого шляху для всіх перелічених вище вимог? Отже - що робити GetRootPath?

PS: Я знаю, що можу перевірити, чи (HttpContext.Current! = Null), тоді не з'єднуйте шлях налагодження, але має бути більш елегантний спосіб?

3

1 Відповіді

Ви можете використати властивість 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.

Надія, це допомагає.

1
додано
@Ales Potocnik Hahonina: Так, для збірки, встановлених в GAC, вищенаведений рішення не буде працювати. Я не можу придумати інше рішення без використання класу HttpContext.
додано Автор Hans, джерело
Існує 2 проблеми з цим фрагментом: 1: він поверне каталог на один рівень вище кордону програми для веб-додатків і 2: якщо ви коли-небудь встановили збірку, використовуючи це в GAC, або мати його в системному каталозі, він поверне неправильний шлях після того, як Assembly.GetExecutingAssembly() повертає збірку, яку ви називаєте цим кодом.
додано Автор Ales Potocnik Hahonina, джерело
Ну, я можу жити, покладаючись на те, що збірка журналів завжди буде частиною програми, що використовує її та розгортається в тій же папці. Що стосується кореневого веб-додатку, я додав перевірку, чи (HttpContext.Current == null), то суфікс шляху піднімається двома каталогами (консольним додатком), іншим лише одним каталогом (веб-додаток у режимі налагодження). Позначення як відповідь, оскільки пропозиція мені допомогла.
додано Автор Ales Potocnik Hahonina, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug