5

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

我的问题

但是我需要在我的本地机器上安装更多相同应用程序的服务。所以我需要给他们不同System.ServiceProcess.ServiceBase.ServiceName的s!所以再次考虑安装代码:

[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);
    }
}

有没有办法让我在调用时传递服务的名称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);
}

但是当然不行,这个文件是在应用程序运行的时候调用的!!!

4

2 回答 2

3

您可以打开配置文件以执行程序集。如果您的安装程序代码放置在主服务 exe 文件中 - 这将是您的 app.config。否则,配置文件需要命名为 [assemblyname].dll.config。

process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();

var path = Assembly.GetExecutingAssembly().Location;
var config = ConfigurationManager.OpenExeConfiguration(path);
service.ServiceName = config.AppSettings.Settings["ServiceName"];
Installers.Add(process);
Installers.Add(service);

此外,本文还解释了如何通过命令行显式传递 installutil 参数

于 2013-05-27T08:37:17.373 回答
2

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

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

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

于 2013-05-27T08:24:33.957 回答