我正在尝试在同一台服务器上运行多个服务实例,以支持多种环境。
我尝试按照建议here和here修改ServiceInstaller.ServiceName。
但是,MSDN says“ServiceName必须与[Service]类的ServiceBase.ServiceName相同。”
忽略MSDN,在看到我上面链接的两个页面后,无论如何我都试着这样做了。但是,当我这样做时,我收到一条错误消息,“Windows无法在本地计算机上启动{Display Name}服务。错误1083:此服务配置为运行的可执行程序未实现该服务。”
This answer确认这是该错误的解释。
答案 0 :(得分:0)
这困扰了我很长一段时间。然后,当我第5次阅读this Q&A时,有什么东西击中了我。
那篇文章没有使用动态名称,但我注意到它在Main函数中设置了ServiceBase.ServiceName。在我看来,也许我可以动态地做同样的事情,并且它有效。
我的主要功能现在看起来像这样:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2(),
new Service3()
};
foreach (serviceBase Service in ServicesToRun)
{
service.ServiceName = FunctionToComputeDynamicName(service);
}
ServiceBase.Run(ServicesToRun);
}
我在安装时从Installer.Context获取名称,在运行时从App.config获取名称。如果您需要,也可以使用Args []版本的Main。
轻松获取运行时名称