Установка службы Windows - текущий каталог - PullRequest
0 голосов
/ 18 мая 2011

этот вопрос относится к моему предыдущему . Я написал сервис на C #, и мне нужно сделать его имя динамическим и загрузить имя из файла конфигурации. Проблема в том, что текущим каталогом, в котором вызывается установщик службы, является каталог net framework 4, а не тот, в котором находится моя сборка.

Использование линии (которая помогает с той же проблемой, но пока служба уже запущена) System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

устанавливает каталог на

C:\Windows\Microsoft.NET\Framework\v4.0.30319

, который также был начальным значением.

Как правильно выбрать путь?

Ответы [ 3 ]

9 голосов
/ 18 мая 2011

попробуйте это:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
3 голосов
/ 18 мая 2011

Вы также можете попробовать

Assembly.GetExecutingAssembly( ).Location

Это также работает, если вы не ссылаетесь на winforms или wpf

1 голос
/ 18 мая 2011

У нас была та же проблема в проекте, над которым я работал, но мы выбрали другой подход.Вместо того чтобы использовать файлы App.config, которые должны находиться в том же пути, что и исполняемый файл, мы изменили как класс установщика, так и основную точку входа службы.

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

Так что мы сделали внутри нашего ProjectInstaller:

    private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        string keyPath = @"SYSTEM\CurrentControlSet\Services\" + this.serviceInstaller1.ServiceName;
        RegistryKey ckey = Registry.LocalMachine.OpenSubKey(keyPath, true);
        // Pass the service name as a parameter to the service executable
        if (ckey != null && ckey.GetValue("ImagePath")!= null)
            ckey.SetValue("ImagePath", (string)ckey.GetValue("ImagePath") + " " + this.serviceInstaller1.ServiceName);
    }

    private void ProjectInstaller_BeforeInstall(object sender, InstallEventArgs e)
    {
        // Configura ServiceName e DisplayName
        if (!String.IsNullOrEmpty(this.Context.Parameters["ServiceName"]))
        {
            this.serviceInstaller1.ServiceName = this.Context.Parameters["ServiceName"];
            this.serviceInstaller1.DisplayName = this.Context.Parameters["ServiceName"];
        }
    }

    private void ProjectInstaller_BeforeUninstall(object sender, InstallEventArgs e)
    {
        if (!String.IsNullOrEmpty(this.Context.Parameters["ServiceName"]))
            this.serviceInstaller1.ServiceName = this.Context.Parameters["ServiceName"];
    }

Мы использовали InstallUtil для установки нашего сервиса следующим образом:

[FramerokPath]\installutil /ServiceName=[name] [ExeServicePath]

Затем внутри точки входа Main вашего приложения мы проверили атрибут args, чтобы получить имя установки службы, которую мы установили внутриСобытие AfterInstall.

У этого подхода есть некоторые проблемы, например:

  • Нам пришлось создать имя по умолчанию для службы, которая была установлена ​​без параметра.Например, если имя не было передано нашему сервису, мы используем имя по умолчанию;
  • Вы можете изменить имя сервиса, переданное нашему приложению, чтобы оно отличалось от того, которое было установлено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...