Почему конструктор компонентов создает объект установщика службы, который он (кажется, не использует)? - PullRequest
0 голосов
/ 16 августа 2011

Следуя инструкциям, приведенным в http://msdn.microsoft.com/en-us/library/zt39148a.aspx#Y684,, я создал службу Windows, которую успешно установил и протестировал. Но я озадачен чем-то в компонентах, используемых для установки сервиса.

Установка службы выполняется с помощью сгенерированного дизайнером класса ProjectInstaller, показанного ниже. Этот класс используется installutil.exe (в .NET Framework) для установки службы и связанного с ней процесса службы. Сгенерированный дизайнером код создает два объекта установщика: MyServiceInstaller для службы и MyServiceProcessInstaller для процесса службы, который будет использоваться installutil.exe во время установки. Тем не менее, он вставляет только последний в коллекцию Installers.

Так как сам сервис устанавливается? Существует ли «служба по умолчанию» для процесса обслуживания, если никакие службы не установлены явно вместе с процессом обслуживания?

КОД:

(Если вы поэкспериментируете с этим, вы обнаружите, что Дизайнер фактически создает этот класс, используя два частичных класса. Я для простоты объединил их в один класс.)

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

1 Ответ

0 голосов
/ 16 августа 2011

ServiceInstaller необходимо добавить в коллекцию установщиков. Я выполнил те же действия, которые описаны в статье, и все получилось правильно:

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

}
...