У нас была та же проблема в проекте, над которым я работал, но мы выбрали другой подход.Вместо того чтобы использовать файлы 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.
У этого подхода есть некоторые проблемы, например:
- Нам пришлось создать имя по умолчанию для службы, которая была установлена без параметра.Например, если имя не было передано нашему сервису, мы используем имя по умолчанию;
- Вы можете изменить имя сервиса, переданное нашему приложению, чтобы оно отличалось от того, которое было установлено.