Приложение .NET Core 2, работающее как служба Windows, не может установить базовый путь в качестве исполняемого каталога

#c# #.net-core

#c# #.net-core

Вопрос:

У меня есть приложение .NET Core, которое отлично работает из командной строки, но когда я добавляю его как службу Windows и запускаю, SetBasePath использует нечетные местоположения, а не местоположение, в котором находится исполняемый файл, где у меня есть файл appsettings.json, который я пытаюсь загрузить.

         .ConfigureAppConfiguration((hostContext, config) =>
        {
            config
                .SetBasePath(Environment.CurrentDirectory)
                //.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);

            config.AddEnvironmentVariables();
        })
 

Я попробовал среду.CurrentDirectory, который работает из командной строки, но как служба Windows, которая в конечном итоге c:WindowsSystem32

При использовании сборки.GetExecutingAssembly() .Местоположение В итоге я получаю путь во временной папке. Если мой исполняемый файл находится в C:MyWindowServicesMyWindowsService.exe как мне использовать SetBasePath для правильного расположения исполняемого файла, чтобы я мог загрузить файл appsettings.json.

Ответ №1:

В качестве обходного пути вы можете поместить свое приложение в Program Files и использовать

 Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "YouAppfolder")
 

внутри следующего кода

 //using System;
//using System.IO;

.ConfigureAppConfiguration((hostContext, config) =>
        {
            config
                .SetBasePath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "YouAppfolder"))
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);

            config.AddEnvironmentVariables();
        })
 

Обратите внимание, что в зависимости от вашей ОС это может быть Program Files или Program Files(86)

Комментарии:

1. Да, я рассматривал это, но установщик позволяет пользователю устанавливать его по любому желаемому пути, поэтому это не сработает, поскольку я не знаю, где он был установлен. Похоже, должен быть способ получить физическое местоположение исполняемого файла.

Ответ №2:

Наконец-то нашел ответ на этот вопрос. Все другие решения, представленные здесь, и когда вы Google об этом, вернули временную папку вместо фактического местоположения exe-файла.

 var executablePath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);