Archivo

Archive for junio 2012

[How to] Crear un servicio de Windows

junio 22, 2012 Deja un comentario

Buenas,

En una de mis actividades del día tengo que crear un Servicio de Windows que se encargue de depurar algunas tablas en la Base de Datos, y como parte de mi intento por seguir escribiendo en este Blog, aquí les platico como es que hago este servicio.

Lo primero es Crear el Proyecto:

1.- Creamos un proyecto desde Visual Studio, con la plantilla de: “Windows Service”

image

Asignamos el nombre correspondiente. Lo que vemos en el proyecto son dos archivos, uno llamado Service1.cs y el Program.cs.

 

image

Para observar el código de Service1.cs basta con hacer clic derecho en el fondo gris que nos aparece y seleccionar ver código, o bien presionando F7, como se pueden dar cuenta, aquí estás los métodos para iniciar el Servicio y para Detenerlo. Aquí escribiéremos el código que necesitemos para cuando se ejecuten estos eventos.

Bien ahora podemos editar algunas de las propiedades de nuestro servicio como son:

  Nombre Descripción
Propiedad pública AutoLog Indica si los comandos Iniciar, Detener, Pausar y Continuar deben notificarse en el registro de eventos.
Propiedad pública CanHandlePowerEvent Obtiene o establece un valor que indica si el servicio puede controlar notificaciones de los cambios de estado de la alimentación del equipo.
Propiedad pública CanHandleSessionChangeEvent Obtiene o establece un valor que indica si el servicio puede controlar eventos de cambio de sesión recibidos de una sesión de Terminal Server.
Propiedad pública CanPauseAndContinue Obtiene o establece un valor que indica si se puede pausar y reanudar el servicio.
Propiedad protegida CanRaiseEvents Obtiene un valor que indica si el componente puede generar un evento. (Se hereda de Component).
Propiedad pública CanShutdown Obtiene o establece un valor que indica si se debe informar al servicio de que el sistema se está cerrando.
Propiedad pública CanStop Obtiene o establece un valor que indica si puede detenerse el servicio una vez se ha iniciado.
Propiedad pública Container IContainer that contains the Component.’ data-guid="820b3092646429b7ca584d7070fb2741">IContainer that contains the Component.’ data-guid="820b3092646429b7ca584d7070fb2741">Obtiene IContainer que contiene Component. (Se hereda de Component).
Propiedad protegida DesignMode Component is currently in design mode.’ data-guid="92b14b816d9ff2682c4a51ee3ff07f92">Component is currently in design mode.’ data-guid="92b14b816d9ff2682c4a51ee3ff07f92">Obtiene un valor que indica si Component está actualmente en modo de diseño. (Se hereda de Component).
Propiedad pública EventLog Obtiene un registro de eventos que se puede utilizar para escribir la notificación de llamadas de comandos de servicio, como Iniciar y Detener, en el registro de eventos de aplicación.
Propiedad protegida Events Component.’ data-guid="41716543b8cc97b6827325125b214887">Component.’ data-guid="41716543b8cc97b6827325125b214887">Obtiene la lista de controladores de eventos asociados a Component. (Se hereda de Component).
Propiedad pública ExitCode Obtiene o establece el código de salida para el servicio.
Propiedad protegida ServiceHandle Obtiene el identificador del control de servicios para el servicio.
Propiedad pública ServiceName Obtiene o establece el nombre corto utilizado para identificar el servicio en el sistema.
Propiedad pública Site ISite of the Component.’ data-guid="75f8b75e7a6898f869c5d0fb7d4dd047">ISite of the Component.’ data-guid="75f8b75e7a6898f869c5d0fb7d4dd047">Obtiene o establece ISite de Component. (Se hereda de Component).

Por el momento solo editaré el nombre del Servicio, ya que las opciones que trae por defecto sirven para mi propósito.

Para hacer más practico el ejemplo, simularé mi tarea y limpiaré una tabla cada 12 horas, entonces en el método OnStart, coloco el siguiente código:

protected override void OnStart(string[] args)
{
    Timer timer = new Timer { Enabled = true, Interval = 43200000 }; //43200000  son 12 horas
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Start();
}

Y en el Handler del timer, colocaré mi código:

 

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //TODO: Código para limpiar mi tabla
    new ProcesoLimpiar().Ejecutar();
}

Este código se ejecutará en mi caso, cado 12 horas.

2.- Agregar un Instalador.

Ahora para terminar vamos a agregar un instalador a nuestro servicio. Para hacer nos colocamos en modo de diseño de nuestro servicio, clic derecho y Add Installer.

En este punto se  agregará una clase llamada ProjectInstaller.cs, que contiene dos archivos, serviceInstaller1 donde indicaremos el nombre del servicio y el tipo de inicio. Además de el nombre a mostrar y una descripción de lo que hace la aplicación. Estos dos últimos datos serán los que se mostrarán en el listado de servicios de Windows.

Por último, si seleccionamos el otro elemento, serviceProjectInstaller1, podemos seleccionar el tipo de cuenta con la que queremos que se ejecute el servicio.

image

Con esto tenemos listo nuestro servicio de Windows.

3.- Instalación y Desinstalación

Desde la línea de comandos podemos instalar/desinstalar un servicio Windows. El comando InstallUtil.exe se instala automáticamente con Visual Studio y podemos ejecutarlo a través de Visual Studio Command Prompt.

Instalación:

InstallUtil.exe miEjecutable.exe

Desinstalación

InstallUtil.exe /u miEjecutable.exe

 

Listo, esto es todo. Espero que les sea de utilidad.

Technorati Tags: ,,,
Categorías: C#, how to, Tips, Windows