C# 如何在安装时(或在编译时)配置Windows服务的名称?

C# 如何在安装时(或在编译时)配置Windows服务的名称?,c#,.net,windows-services,windows-installer,C#,.net,Windows Services,Windows Installer,我用C#创建了一个Windows服务,安装在服务器上,运行良好 现在,我想再次安装相同的服务,但从不同的工作目录运行,具有不同的配置文件等。因此,我希望同时运行相同服务的两个(或更多)实例。 最初,这是不可能的,因为安装程序会抱怨已经安装了具有给定名称的服务 我可以通过更改代码,将ServiceBase.ServiceName属性设置为新值,然后重新编译并再次运行InstallUtil.exe来克服这一问题。然而,我更希望我能在安装时设置服务名称,也就是说,理想情况下我会像 InstallUti

我用C#创建了一个Windows服务,安装在服务器上,运行良好

现在,我想再次安装相同的服务,但从不同的工作目录运行,具有不同的配置文件等。因此,我希望同时运行相同服务的两个(或更多)实例。 最初,这是不可能的,因为安装程序会抱怨已经安装了具有给定名称的服务

我可以通过更改代码,将
ServiceBase.ServiceName
属性设置为新值,然后重新编译并再次运行InstallUtil.exe来克服这一问题。然而,我更希望我能在安装时设置服务名称,也就是说,理想情况下我会像

InstallUtil.exe/i /servicename=“MyService实例2” MyService.exe

如果这无法实现(我非常怀疑),我希望在构建服务时能够注入服务名称。我认为可能会使用某种构建事件,使用巧妙的msbuild或nant技巧,或者类似的方法,但我没有任何线索

如有任何建议,将不胜感激


谢谢您的时间。

您不能将此作为命令行参数传入,因为InstallUtil没有为此提供正确的挂钩


但是,您可以让服务安装程序从配置文件中读取ServiceName。如果您需要一个典型的ServiceInstaller,您会发现这只是在运行时设置适当的DisplayName和ServiceName属性的问题。这些可以很容易地从配置文件中读取,而不是硬编码。

我尝试使用

ConfigurationManager.OpenExeConfiguration(string exePath)
在安装程序中,但无法使其工作

相反,我决定在安装程序中使用
System.Environment.GetCommandLineArgs()
,如下所示:

string[] commandlineArgs = Environment.GetCommandLineArgs();

string servicename;
string servicedisplayname;
ParseServiceNameSwitches(
    commandlineArgs, 
    out servicename, 
    out servicedisplayname);

serviceInstaller.ServiceName = servicename;
serviceInstaller.DisplayName = servicedisplayname;
现在我可以使用

InstallUtil.exe/i InstallableService.dll /servicename=“myserviceinstance_2” /servicedisplayname=“我的服务 实例2“


我写了一个更详细的解释。

而不是使用
Environment.GetCommandLineArgs()
Installer
有一个名为
Context
的属性,您可以从该属性访问传递给InstallUtil的命令行参数,这些参数在一个漂亮的
StringDictionary

中结构化,您有没有理由不让您的服务能够在n-threads中为n-config文件执行业务逻辑?因此,从一开始就保存多实例问题?嗯,这可能是一个好的观点。但该服务是在一年前创建的,当时我还没有意识到我希望能够运行多个实例,因此应用程序的体系结构并不正确。然而,我已经找到了一个解决方案,并将在几秒钟后发布。真的吗?在安装windows服务的过程中,我尝试从ServiceExeName.config文件中读取这些值,但不起作用:(查看问题和答案以获得完美的解决方案:请您将“更详细的解释”发布到某个地方好吗?您的链接不起作用,我想阅读