Aquí va un pequeño How-to rápido de como se crea e instala un servicio Windows con .NET y Visual Studio 2005 dedicado a mi compañero Juanma Otero que a cambio me explicará como funcionan los EndPoints de SQL Server :D
Cada vez que vayamos a crear un servicio Windows, podemos seguir estos pasos para crear lo que sería el contenedor y su capacidad de instalación, para luego más tranquilamente empezar a introducir la lógica y funcionalidad del negocio que le queramos dar.
1. Creando.
Se utiliza un proyecto Windows Service, que digamos es un contenedor en el que tenemos que implementar las acciones básicas de un servicio como son Start, Stop, Pause, Restar... etc.. En un próximo artículo me meteré un poco más a fondo en el tema de la implementación , como usar el EventLog... etc.. etc..
2. Haciéndolo instalable.
Añadimos al proyecto una Installer Class desde el menu "Add New Item", que nos provee la funcionalidad de instalación. Hay dos componentes que no están en la paleta que nos hacen falta, aunque se puede hacer "a pelo" ... siempre los añado...
Añadimos a la paleta de componentes las clases ServiceInstaller y ServiceProcessInstaller . Añadimos estos componentes al diseñador de la clase instaladora y los configuramos. No hay mucho que configurar :P
En el ServiceInstaller, configuramos el nombre que mostrará, la descripción, el nombre por el que invocaremos al servicio y el tipo incio. Ponemos que el "Parent" es la clase InstallerClass.
En el ServiceProcessInstaller configuramos la cuenta de usuario con la que se ejecutará el servicio, por lo general LocalService que es una cuenta con pocos privilegios. Ponemos que el "Parent" es la clase instaladora.
3. El instalador.
Añadimos al a solución un proyecto "Setup Project" que nos provee de la funcionalidad de un asistente instalador.
Dentro de este proyecto, vamos al "File System Editor" y en "Application Folder" le decimos "Add Project Output", seleccionamos "Primary Output", nuestro proyecto en el combo y configuracion (Active) (para que use la que nosotros usemos ... Debug ó Release).
Ahora vamos al "Custom Actions Editor" y directamente sobre el elemento "Custom Actions" añadimos la salida del proyecto que hemos puesto en "Application Folder".
4. Instalando.
Construimos la solución y el proyecto de instalación, este último genera un paquete .msi y un .exe asociado, con eso ya se puede instalar por ahí :D pero para trabajar en desarrollo nada más comodo que botón derecho e Install ;)
Lo instalamos y vemos que ya aparece en nuestra consola de administración de servicios. Podemos iniciarlo, pararlo, reiniciarlo... etc...
5. Haciendo que se inicie automáticamente al instalarlo.
Si, aunque se configure que debe iniciarse automáticamente... eso será en el próximo reinicio de la máquina. Para que se inicie automáticamente la primera vez ... nos suscribimos al evento AfterInstall del componente ServiceInstaller que añadimos a la clase instaladora y hacemos que el servicio arranque con ServiceController:
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
using (ServiceController svc = new ServiceController("MiServicio"))
svc.Start();
}
Con esto una vez el servicio este instalado automáticamente se iniciará.
Ahora podemos ponernos manos a la obra en integrar nuestra lógica dentro del servicio. Yo por comodidad... creo un proyecto "Console Application" normal para desarrollo y primeras pruebas, cuando ya esta todo listo... integro los ensamblados en el servicio, pero bueno... "cada maestrillo tiene su librillo..." :)