c # - Hvorfor genererer komponentdesigneren et serviceinstallationsobjekt, som det ikke (synes at) bruger?

Indlæg af Hanne Mølgaard Plasc

Problem



Efter trinene beskrevet i http://msdn.microsoft.com/en-us/library/zt39148a.aspx#Y684, har jeg oprettet en Windows-tjeneste, som jeg har installeret og testet. Men jeg er forvirret af noget i de komponenter, der bruges til at installere tjenesten. [9]


Installation af tjenesten udføres af en designergenereret ProjectInstaller klasse, vist nedenfor. Denne klasse bruges af installutil.exe (i .NET Framework) for at installere tjenesten og den tilhørende serviceproces. Den designergenererede kode opretter to installationsobjekter: MyServiceInstaller for tjenesten og MyServiceProcessInstaller for serviceprocessen, der skal bruges af installutil.exe på installationstidspunktet. Det indsætter dog kun sidstnævnte i Installers samlingen.


Så hvordan bliver tjenesten selv installeret? Er der en 'standard service' for serviceprocessen, hvis der ikke eksplicit installeres tjenester sammen med serviceprocessen?


CODE:


(Hvis du eksperimenterer med dette, vil du opdage, at Designer faktisk opretter denne klasse ved hjælp af to delklasser. Jeg har konsolideret disse i en enkelt klasse for enkelhed.)


namespace MyService
{
    [RunInstaller(true)]
    public class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.MyServiceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
            this.MyServiceInstaller = new System.ServiceProcess.ServiceInstaller();
            // 
            // MyServiceProcessInstaller
            // 
            this.MyServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
            this.MyServiceProcessInstaller.Password = null;
            this.MyServiceProcessInstaller.Username = null;
            // 
            // MyServiceInstaller
            // 
            this.MyServiceInstaller.ServiceName = "MyService";
            // 
            // ProjectInstaller
            // 
            this.Installers.AddRange(new System.Configuration.Install.Installer[] {
            // *** Expected here:  this.MyServiceInstaller,
            this.MyServiceProcessInstaller});
        }

        private System.ServiceProcess.ServiceProcessInstaller MyServiceProcessInstaller;
        private System.ServiceProcess.ServiceInstaller MyServiceInstaller;
    }
}

Bedste reference


ServiceInstaller skal tilføjes til samlingen af ​​installatører. Jeg fulgte de samme trin som beskrevet i artiklen, og det kom ud korrekt:


private void InitializeComponent()
{
   this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
   this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
   // 
   // serviceProcessInstaller1
   // 
   this.serviceProcessInstaller1.Password = null;
   this.serviceProcessInstaller1.Username = null;
   // 
   // serviceInstaller1
   // 
   this.serviceInstaller1.ServiceName = "Service1";
   // 
   // ProjectInstaller
   // 
   this.Installers.AddRange(new System.Configuration.Install.Installer[] {
      this.serviceProcessInstaller1,
      this.serviceInstaller1});

}