Así que hemos creado un servicio de Windows para enviar datos a la aplicación de nuestro cliente y todo va muy bien. El cliente ha presentado una solicitud de configuración divertida que requiere dos instancias de este servicio ejecutándose en el mismo servidor y configuradas para apuntar a bases de datos separadas.
Hasta ahora no he podido hacer que esto suceda y esperaba que mis compañeros miembros de stackoverflow pudieran dar algunas pistas de por qué.
Configuración actual:
Configuré el proyecto que contiene el servicio de Windows, lo llamaremos AppService de ahora en adelante, y el archivo ProjectInstaller.cs que maneja los pasos de instalación personalizados para establecer el nombre del servicio basado en una clave en App.config así :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
En este caso, Util es solo una clase estática que carga el nombre del servicio del archivo de configuración.
De aquí en adelante, he probado dos formas diferentes de instalar ambos servicios y ambos han fallado de manera idéntica.
La primera forma fue simplemente instalar la primera copia del servicio, copiar el directorio instalado y renombrarlo, y luego ejecutar el siguiente comando después de modificar la configuración de la aplicación para cambiar el nombre del servicio deseado:
InstallUtil.exe /i AppService.exe
Cuando eso no funcionó, intenté crear un segundo proyecto de instalación, edité el archivo de configuración y construí el segundo instalador. Cuando ejecuté el instalador, funcionó bien, pero el servicio no aparecía en services.msc, así que ejecuté el comando anterior contra el segundo código base instalado.
En ambas ocasiones recibí el siguiente resultado de InstallUtil (solo partes relevantes):
Ejecutando una instalación transaccional.
Comenzando la fase de instalación de la instalación.
Instalando el servicio App Service Two ... Service App Service Two se ha instalado correctamente. Creando el servicio de aplicación de origen de EventLog dos en la aplicación de registro ...
Se produjo una excepción durante la fase de instalación. System.NullReferenceException: referencia de objeto no establecida en una instancia de un objeto.
Está comenzando la fase de reversión de la instalación.
Restaurando el registro de eventos al estado anterior para el App Service Two de origen. Aplicación de servicio Servicio dos se está eliminando del sistema ... Aplicación de servicio Servicio dos se eliminó correctamente del sistema.
La fase de reversión se completó con éxito.
La instalación de la transacción se completó. La instalación falló y se realizó la reversión.
Lo siento por la publicación tan larga, quería asegurarme de que haya suficiente información relevante. La pieza que hasta ahora me ha dejado perplejo es que afirma que la instalación del servicio se completa con éxito y solo después de que va a crear la fuente EventLog parece que se lanza la NullReferenceException. Entonces, si alguien sabe lo que estoy haciendo mal o tiene un mejor enfoque, sería muy apreciado.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Puede insertar código en el instalador para obtener el nombre de servicio que desea cuando ejecuta installutil.