2011-05-17 108 views
4

我有一个项目,其中包括2个窗口服务。我创建一个ProjectInstaller来安装这些项目,这很好。但我有一个问题;根据下面定义的代码,项目安装程序如何知道为serviceInstaller1安装哪个服务以及为serviceInstaller2安装哪个服务?一个装配中的多个服务。安装程序如何知道要安装并启动哪个服务?

它只是基于ServiceName吗?

[RunInstaller(true)] 
public partial class ProjectInstaller : System.Configuration.Install.Installer 
{ 
    private ServiceProcessInstaller process; 
    private ServiceInstaller serviceInstaller1; 
    private ServiceInstaller serviceInstaller2; 
    public ProjectInstaller() 
    { 
     InitializeComponent(); 
     try 
     { 
      process = new ServiceProcessInstaller(); 
      process.Account = ServiceAccount.LocalSystem; 
      serviceInstaller1 = new ServiceInstaller(); 
      serviceInstaller1.ServiceName = "xxx"; 
      serviceInstaller1.Description = "Does Something"; 
      serviceInstaller1.StartType = ServiceStartMode.Automatic; 

      serviceInstaller2 = new ServiceInstaller(); 
      serviceInstaller2.ServiceName = "yyy"; 
      serviceInstaller2.Description = "Does something else"; 
      serviceInstaller2.StartType = ServiceStartMode.Automatic; 
      Installers.Add(process); 
      Installers.Add(serviceInstaller1); 
      Installers.Add(serviceInstaller2); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Failed", ex); 
     } 
    } 
} 

回答

4

它基于ServiceName

安装程序并不关心名称,您可以提供几乎任何名称,安装程序将很乐意为您注册一个带有此名称的Windows服务,但是当您尝试启动服务时,它将失败,除非它在您的程序集中找到与安装程序中指定的ServiceName匹配的ServiceName服务。

Error 1083: The executable program that this service is configured to run in does not implement the service. 
+0

还有一个问题,当仅使用一个服务进行部署时,我假设名称并不重要,因为它只是安装它找到的第一个服务。它是否正确? – 2011-05-18 08:53:39

+2

@Mick Walker - 如果您在安装程序中有一项服务,并且您为'ServiceBase.Run()'方法提供了一项或多项服务,则无论服务名称如何,集合中的第一项服务都将被使用。 – 2011-05-18 15:59:20

+0

如果我需要使用不同凭据从一个程序集创建两个服务,该怎么办? – Kobor42 2013-10-18 14:15:00