В том же духе, что и ответ Джейсона Гомаата, именно так вы будете проходить по всем доступным установщикам в вашем проекте, что экономит ваше время, когда вы добавляете каждый новый сервис в этот класс. В моем проекте у меня в общей сложности 12 служб (и мы добавляем новую здесь и там), и мы хотели, чтобы они были сгруппированы по имени экземпляра, поэтому службы SVC (экземпляр 1) XX и служба SVC (экземпляр 1) YY находились рядом друг с другом при просмотре в консоли оснастки служб.
public ProjectInstaller()
{
InitializeComponent();
var config = ConfigurationManager.OpenExeConfiguration(this.GetType().Assembly.Location);
string instanceName = config.AppSettings.Settings["Installer_NamedInstanceName"].Value;
string instanceID = config.AppSettings.Settings["Installer_NamedInstanceID"].Value;
bool usesNamedInstance = !string.IsNullOrWhiteSpace(instanceName) && !string.IsNullOrWhiteSpace(instanceID);
if (usesNamedInstance)
{
foreach (var installer in this.Installers)
{
if (installer is ServiceInstaller)
{
var ins = (ServiceInstaller)installer;
ins.ServiceName = ins.ServiceName + "-" + instanceID;
// Want the service to be named SVC (Instance Name) Audit Log Blah Blah Service
ins.DisplayName = ins.DisplayName.Replace("SVC ", "SVC (" + instanceName + ") ");
}
}
}
}
ОДНАКО , есть еще кое-что, что вам нужно сделать - при инициализации службы вы также должны изменить имя службы, в противном случае вы получите сообщение об ошибке «Исполняемый файл не делает» т реализовать услугу ". Я сделал это, реализовав следующий код в Program.cs
:
internal static void HandleCustomServiceName(ServiceBase sbase)
{
if (!string.IsNullOrWhiteSpace(customInstanceName))
{
sbase.ServiceName = sbase.ServiceName + "-" + customInstanceName;
}
}
Тогда в конструкторе каждого сервиса:
public SystemEventWatcher()
{
InitializeComponent();
Program.HandleCustomServiceName(this);
}
Я одобрил ответ Джейсона за то, что он проложил путь к реализации этого в моем собственном проекте. Спасибо!