ServiceInstaller no funciona de forma específica respecto al servicio al que está asociado. La utilidad de instalación lo utiliza para escribir valores del Registro asociados al servicio en una subclave dentro de la clave de Registro HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. El servicio se identifica mediante su propiedad ServiceName dentro de esta subclave. La subclave incluye también el nombre del ejecutable o archivo .dll al que pertenece el servicio.
Para instalar un servicio, cree una clase de instalador del proyecto que se herede de la clase Installer, y establezca el atributo RunInstallerAttribute de la clase en true. Dentro del proyecto, cree una instancia de ServiceProcessInstaller por aplicación de servicio y una instancia de ServiceInstaller por cada servicio de aplicación. Dentro del constructor de clase de instalador del proyecto, establezca las propiedades de instalación del servicio utilizando las instancias de ServiceProcessInstaller y ServiceInstaller y agregue las instancias a la colección Installers.
Nota |
|---|
| Se recomienda que utilice el constructor para agregar instancias del instalador; no obstante, si tiene que agregar a la colección Installers del método Install, asegúrese de realizar las mismas agregaciones a la colección del método Uninstall. |
Para todas las clases que derivan de la clase Installer, el estado de la colección Installers debe ser igual en los métodos Install y Uninstall. No obstante, se puede impedir el mantenimiento de la colección en los métodos Install y Uninstall si se agregan instancias del instalador a la colección Installers en el constructor de clase del instalador personalizado. Cuando se llama a la utilidad de instalación, se busca el atributo RunInstallerAttribute. Si el valor del atributo es true, la utilidad instala todos los servicios que se agregaron a la colección Installers asociados al instalador del proyecto. Si RunInstallerAttribute es false o no existe, la utilidad de instalación omite el instalador del proyecto.
El objeto ServiceProcessInstaller asociado a la clase de instalación del proyecto instala información común a todas las instancias de ServiceInstaller del proyecto. Si este servicio tiene algo que lo diferencia de los demás servicios del proyecto de instalación, este método instala esa información específica del servicio.
Nota |
|---|
| Es fundamental que la propiedad ServiceName sea idéntica a la propiedad ServiceBase.ServiceName de la clase que se derivó de ServiceBase. Normalmente, el valor de la propiedad ServiceBase.ServiceName del servicio está establecido en la función Main() del ejecutable de la aplicación de servicio. El Administrador de control de servicios utiliza la propiedad ServiceInstaller.ServiceName para buscar el servicio en este ejecutable. |
Puede modificar otras propiedades de ServiceInstaller antes o después de agregarlo a la colección Installers del instalador del proyecto. Por ejemplo, se puede establecer la propiedad StartType de un servicio de manera que inicie el servicio automáticamente al reiniciar o que, por el contrario, requiera que un usuario inicie el servicio de forma manual.
Por lo general, no se llamará a los métodos en ServiceInstaller dentro del código; se suelen llamar sólo desde la utilidad de instalación. La utilidad de instalación llama de forma automática a los métodos ServiceProcessInstaller.Install y ServiceInstaller.Install durante el proceso de instalación. Deshace los errores, si es necesario, mediante una llamada a Rollback (o ServiceInstaller.Rollback) en todos los componentes instalados anteriormente.
La utilidad de instalación llama a Uninstall para que quite el objeto.
La rutina de instalación de una aplicación mantiene de forma automática la información acerca de los componentes que ya se han instalado mediante la propiedad Installer.Context del instalador del proyecto. Esta información de estado se actualiza continuamente a medida que la utilidad instala la instancia de ServiceProcessInstaller y cada una de las instancias de ServiceInstaller. No suele ser necesario que el código modifique esta información de estado de forma explícita.
Cuando se realiza la instalación, se crea de forma automática un EventLogInstaller para instalar el origen de registro de eventos asociado a la clase derivada de ServiceBase. La propiedad Log de este origen se establece mediante el constructor de ServiceInstaller en el registro de aplicación del equipo. Cuando se establece la propiedad ServiceName de ServiceInstaller, que tiene que ser idéntica a la propiedad ServiceBase.ServiceName del servicio, la propiedad Source se establece de forma automática en el mismo valor. En un error de instalación, la instalación del origen se deshace, junto con los servicios instalados anteriormente.
El método Uninstall intenta detener el servicio si éste se encuentra en ejecución. Tanto si lo consigue como si no, Uninstall deshace los cambios realizados por Install. Si se creó un nuevo origen para el registro de eventos, se elimina el origen.