如何通过`installutil`安装长期运行的服务时将参数传递给`Configuration.Install.Installer`

And*_*dry 5 .net c# wcf windows-installer windows-services

我有一个应用程序,我想作为Windows服务运行.按照本MSDN文档页面中提供的说明(我需要托管WCF服务,因此该过程也详细说明了这一部分),我可以这样做,如果我实现示例服务,它就可以了.我使用installutil.exe实用程序,可以安装和卸载我的应用程序作为Windows服务.

我的问题

但是,我需要在本地计算机上安装相同应用程序的更多服务.所以我需要给他们不同的System.ServiceProcess.ServiceBase.ServiceNames!所以再考虑一下安装代码:

[RunInstaller(true)]
public class ProjectInstaller : Installer {
    private ServiceProcessInstaller process;
    private ServiceInstaller service;

    public ProjectInstaller() {
        process = new ServiceProcessInstaller();
        process.Account = ServiceAccount.LocalSystem;
        service = new ServiceInstaller();
        service.ServiceName = /* NEED TO PUT HERE THE NAME!!! */;
        Installers.Add(process);
        Installers.Add(service);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有办法在通话时传递服务名称installutil.exe吗?如何解决这个问题?我也尝试使用该App.Config文件,并执行以下操作:

public ProjectInstaller() {
    process = new ServiceProcessInstaller();
    process.Account = ServiceAccount.LocalSystem;
    service = new ServiceInstaller();
    service.ServiceName = System.Configuration.ConfigurationManager.
        AppSettings["SrvName"];
    Installers.Add(process);
    Installers.Add(service);
}
Run Code Online (Sandbox Code Playgroud)

但当然它不起作用,应用程序运行时会调用此文件!

C4s*_*tor 2

面对这个问题,我首先使用了这里的方法:

但随后我又切换回一个架构,其中有一个服务启动可变数量的进程(在我的例子中,我使用 Zookeeper 设置要运行的进程数量及其命令行参数,但如果这只是一个问题)实例数,app.config就可以了)。

我发现这种方式的主要优点是我的启动服务可以监视正在运行的子进程,例如,如果它崩溃了,可以重新启动它。