У меня есть служба Windows, и мне нужно создать каталог для хранения некоторой информации. Путь к каталогу должен относиться к файлу exe файла Windows. Как получить этот путь к файлу exe?
Как найти windows exe-путь
Ответ 1
Вы можете использовать AppDomain.CurrentDomain.BaseDirectory
Ответ 2
Совет. Если вы хотите найти путь к запуску установленной службы Windows, посмотрите здесь из реестра.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName
Есть ключи об услугах Windows
Ответ 3
Вместо использования каталога относительно исполняемого файла и, следовательно, для использования прав администратора, почему бы не использовать общий каталог данных приложения, доступный через
Environment.GetFolderPath(SpecialFolder.CommonApplicationData)
Таким образом, вашему приложению не требуется доступ на запись в свой собственный каталог установки, что сделает вас более безопасным.
Ответ 4
Чтобы получить путь к сервису, вы можете использовать объект управления. ref: https://msdn.microsoft.com/en-us/library/system.management.managementobject(v=vs.110).aspx http://dotnetstep.blogspot.com/2009/06/get-windowservice-executable-path-in.html
using System.Management;
string ServiceName = "YourServiceName";
using (ManagementObject wmiService = new ManagementObject("Win32_Service.Name='"+ ServiceName +"'"))
{
wmiService.Get();
string currentserviceExePath = wmiService["PathName"].ToString();
Console.WriteLine(wmiService["PathName"].ToString());
}
Ответ 5
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe);
svchost.exe - это исполняемый файл, который запускает вашу службу, которая находится в system32. Следовательно, нам нужно перейти к модулю, который выполняется процессом.
Ответ 6
Попробуйте это
System.Reflection.Assembly.GetEntryAssembly().Location
Ответ 7
Каталог по умолчанию для службы 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);