У меня есть сервис окон, и я должен создать каталог для хранения некоторой информации. Путь к каталогу должен быть относительно сервисного EXE-файла окон. Как может получить этот путь EXE-файла?
Вы можете использовать AppDomain.CurrentDomain.BaseDirectory
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe);
svchost.exe - это исполняемый файл, который запускает вашу службу, которая находится в system32. Следовательно, нам нужно добраться до модуля, который запускается процессом.
Вместо использования каталога, относящегося к исполняемому файлу, и, следовательно, требующих прав администратора, почему бы не использовать общий каталог данных приложения, доступный через
Environment.GetFolderPath(SpecialFolder.CommonApplicationData)
. Таким образом, вашему приложению не нужен доступ для записи в его собственный каталог установки, что делает вас более безопасным.
Каталог по умолчанию для службы Windows - это папка System32. Однако в своей службе вы можете изменить текущий каталог на каталог, который вы указали при установке службы, выполнив следующие действия в своем OnStart:
// Define working directory (For a service, this is set to System)
// This will allow us to reference the app.config if it is in the same directory as the exe
Process pc = Process.GetCurrentProcess();
Directory.SetCurrentDirectory(pc.MainModule.FileName.Substring(0, pc.MainModule.FileName.LastIndexOf(@"\")));
Изменить: еще более простой метод (но я еще не тестировал):
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);