Как найти каталог установки службы Windows с помощью С#?
Я уверен, что служба Windows получает C:\winnt (или подобное) в качестве рабочего каталога при установке с помощью InstallUtil.exe. Есть ли способ получить доступ или иным способом захватить (во время установки) каталог, из которого была установлена служба? На данный момент я вручную вношу это в файл app.exe.config, но это ужасно ручное и выглядит как хак.
Существует ли программный способ во время выполнения или времени установки, чтобы определить, где была установлена служба?
Ответы
Ответ 1
Вы можете использовать отражение, чтобы получить местоположение исполняющей сборки. Вот простая процедура, которая устанавливает рабочий каталог в местоположение исполняющей сборки с использованием отражения:
String path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = System.IO.Path.GetDirectoryName(path);
Directory.SetCurrentDirectory(path);
Ответ 2
Вы хотите, чтобы каталог, содержащий сборку? Если это так, то легко: используйте Assembly.Location
.
Я бы не стал пытаться изменить рабочий каталог процесса, хотя я бы не удивился, если бы у него были неприятные побочные эффекты, если действительно вам разрешено это делать.
Ответ 3
Я не знал метод Directory.SetCurrentDirectory
. Обычно я делаю:
Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
Ответ 4
Хотя очень поздно, но это может помочь кому-то. Я решил эту проблему, используя AppDomain.CurrentDomain.BaseDirectory
string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml";
AppDomain.CurrentDomain.BaseDirectory предоставил каталог, в котором служба Windows фактически не была выполнена, а не C:\Windows\system32\путь.
Я видел это позже, что @Ramon уже опубликовал одно и то же решение.
Ответ 5
InstallUtil.exe
вызывает ServiceInstaller.Install()
вашего приложения во время установки.
Отмените его, добавьте в список вашего проекта Installers
и получите любую необходимую информацию.