C# 如何在安装时(或在编译时)配置Windows服务的名称?
我用C#创建了一个Windows服务,安装在服务器上,运行良好 现在,我想再次安装相同的服务,但从不同的工作目录运行,具有不同的配置文件等。因此,我希望同时运行相同服务的两个(或更多)实例。 最初,这是不可能的,因为安装程序会抱怨已经安装了具有给定名称的服务 我可以通过更改代码,将C# 如何在安装时(或在编译时)配置Windows服务的名称?,c#,.net,windows-services,windows-installer,C#,.net,Windows Services,Windows Installer,我用C#创建了一个Windows服务,安装在服务器上,运行良好 现在,我想再次安装相同的服务,但从不同的工作目录运行,具有不同的配置文件等。因此,我希望同时运行相同服务的两个(或更多)实例。 最初,这是不可能的,因为安装程序会抱怨已经安装了具有给定名称的服务 我可以通过更改代码,将ServiceBase.ServiceName属性设置为新值,然后重新编译并再次运行InstallUtil.exe来克服这一问题。然而,我更希望我能在安装时设置服务名称,也就是说,理想情况下我会像 InstallUti
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文件中读取这些值,但不起作用:(查看问题和答案以获得完美的解决方案:请您将“更详细的解释”发布到某个地方好吗?您的链接不起作用,我想阅读