#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);