Todos conocemos sobradamente que es un “Servicio Windows”(Windows Service), al menos sabemos que hay que activarlos, desactivarlos, etc. y que existe una consola para ello y que se encuentran ejecutándose en la máquina de forma indefinida:

WindowsServices_NET_1.JPG

Pues bien, con este “post” lo que quiero mostrar es el proceso de creación de un Windows Service, y que en su sentido amplio comienza con el desarrollo del código y termina con la ejecución continuada en la máquina, pasando antes por la instalación necesaria para su integración con el sistema.

Proceso:

Creación:

1. Crear un proyecto .NET del tipo Windows Service.

2. Añadir código al método “OnStart”, este es el método que es llamado durante la inicialización del servicio de la consola.

3. Como buenas prácticas es conveniente escribir en el “Event Log” de Windows para dejar constancia de los posibles errores ocurridos.

INSTALACIÓN

1. Añadir al proyecto una clase del tipo “Instaler Class” (), esta clase permitirá al servicio ser instalada/integrada en el sistema.

2. A continuación incluyo un ejemplo de lo que debería tener la clase Installer.

[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
private ServiceInstaller serviceInstaller;
private ServiceProcessInstaller processInstaller;
public ListenerInstaller()
{
InitializeComponent();

processInstaller = new ServiceProcessInstaller();
serviceInstaller = new ServiceInstaller();

//processInstaller.Account =
// System.ServiceProcess.ServiceAccount.User;

processInstaller.Account = ServiceAccount.LocalSystem;

serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServiceName = “MiServicio”;

Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
}
}

3. Esta clase será necesaria para que nuestra utilidad “InstallUtil.exe”(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe) pueda instalarla en el sistema y así poder disponer de nuestro servicio en la consola para manipularlo a nuestro antojo (pararlo, restearlo, cambiar las credenciales, etc.)
Para instalar el servicio utilizaremos esta instrucción: Installutil MiService.exe
Para desinstalarlo esta otra: Installutil /u MiService.exe
4. Una vez instalado el servicio, entraremos en la consola y lo arrancaremos.
5. Si todo el proceso ha sido correcto, nuestro servicio estará realizando su trabajo.
Hasta aquí, bueno, pues será complicado según lo queramos complicar nosotros, pero para un servicio básico y de introducción es más que suficiente, bueno, eso creo.
Algunas NOTAS interesantes a tener en cuenta son:
Si queremos que nuestro servicio acceda a un fichero de configuración “.config”, el acceso a la sección varía un poco con respecto a de una aplicación normal:
int sleepTime = Convert.ToInt32(ConfigurationManager.AppSettings.Get(“SleepTimeMilliseconds”));
1.
Configuration exeConfig =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal)
Int sleepTime = Convert.ToInt32(exeConfig.AppSettings.Settings[“SleepTimeMilliseconds “].Value);
La primera opción es como lo realizamos normalmente, en cuanto a la opción dos, es como tendremos que hacerlo en un Windows Service.
Otra de los puntos a tener en cuenta y además creo que, quizás uno de los más importantes es:
Normalmente utilizaremos un servicio para que esté ejecutándose en la máquina de forma indefinida y para ello tendremos que seguir los siguientes pasos.
Si introducimos un bucle while(! bStop){ … } or while (true) { … } nunca podremos arrancarlo/inicializarlo puesto que el evento “OnStart” nunca terminará. Como podemos conseguir este cometido, ¿Arrancar el servicio y tener nuestro bucle while? Pues bien, para ello necesitamos ejecutar nuestro bucle en un hilo aparte, de esta forma el evento “OnStart” termina y nuestro hilo es el que sigue la ejecución para realizar el trabajo. El siguiente método OnStart puede ser un ejemplo de ello.
protected override void OnStart(string[] args)
{
base.OnStart(args);
Thread t = new Thread(new ThreadStart(Run));
t.Start();
}
private void Run()
{…}
Donde Run() será el método encargado de soportar todo el trabajo a realizar.
Además nuestro bucle while deberá tener una espera en cada iteración para evitar sobrecargar a la CPU, para ello:
System.Threading.Thread.Sleep(sleepTime)
Teniendo en cuenta estos puntos básicos, la creación de un servicio Windows resultará muy fácil de implementar y entender y por ello creo que a partir de ahora todos tendremos un poquito más clara (al menos técnicamente) que es un servicio.
Tened en cuenta también los métodos, OnPause, OnContinue, OnStop ya que serán necesarios en ocasiones, y sobre todo el OnStop, pues es aquí donde se liberarán recursos y se establecerá el valor de alguna variable booleana(bStop) para terminar nuestro “famoso” bucle.
No olvidar tampoco que existe el método OnCustomCommad y que será utilizado para la integración con otras aplicaciones.
Una vez más espero que esta pequeña introducción os haya ayudado.
Saludos
Juanlu