lunes, 26 de marzo de 2012

Creación de Servicios de Windows (C# .NET VS2010)

Pues resulta que la semana pasada tuve la necesidad de crear un servicio de windows el cual se encargará de enviar notificaciones via correo electrónico cada determinado tiempo.

En esta entrada les mostraré como crear un Servicio de Windows y su respectivo instalador, más adelante publicaré como enviar las notificaciones.


¿Qué son los servicios de windows?

Los servicios son procesos que se encuentran en ejecución en segundo plano y pueden ser configurados para iniciarse junto con el sistema operativo o bien se pueden iniciar manualmente cuando sea necesario.

¿Cómo puedo crear mi servicio de windows?

Para crear un servicio de windows hay que seguir los siguientes pasos:

  1. Creamos un nuevo proyecto utilizando la plantilla Windows Service.


  2. Automáticamente nos crea algunos archivos, entre ellos Program.cs que es la clase que contiene el método Main, el cual es el encargado de ejecutar el servicio que en este caso se llama Service1.


  3. El archivo Service1.cs contiene los eventos OnStart y OnStop los cuales reaccionan al iniciar y al detener el servicio respectivamente.


  4. Ya que en este caso necesitamos que se realice una tarea cada cierto tiempo vamos a apoyarnos en un Timer el cual vamos a configurarlo de la siguiente forma.


  5. Ya con nuestro Timer creado vamos a agregar la funcionalidad que queremos que se realice cada que se cumpla el tiempo establecido, para fines de ejemplo solo haré que escriba en un log cada 10 segundos.


  6. Agregamos al evento OnStart la linea de código para iniciar el Timer y al OnStop el de detenerlo.


  7. Compilamos y tenemos listo nuestro servicio
Ya que tenemos el servicio ahora se preguntaran, ¿Cómo lo uso?, pues para poder utilizarlo hay que crear otro proyecto el cual nos ayudará a instalarlo.

Setup de instalación

Lo primero que tenemos que hacer es agregar al Toolbox los siguientes componentes
  • ServiceController
  • ServiceInstaller
  • ServiceProcessInstaller


Después seleccionamos nuestro proyecto y agregamos un nuevo item.  El que vamos a agregar es Installer Class.


Una vez agregado vamos a arrastrar el ServiceInstaller y el ServiceProcessInstaller que habíamos agregado antes a nuestro Toolbox.


Configuramos las siguientes propiedades de serviceInstaller1:
  • Description - Aquí detallamos la descripción del Servicio.
  • DisplayName - Definimos el nombre que deseamos que aparezca.
  • ServiceName - Asignamos el nombre del Servicio.
  • StartType - Seleccionamos Automatic para que el Servicio se inicie automáticamente al iniciar el SO.


Después de esto configuramos las propiedades de serviceProcessInstaller1
  • Account - Seleccionamos la opción LocalSystem
  • Parent - Aquí debemos asegurarnos que este seleccionado Instalador


Y ahora si, estamos listos para crear el Setup de instalación, para lo cual seguiremos los siguientes pasos:


Vamos a nuestra solución y agregamos un nuevo proyecto de tipo Setup Project.


Una vez agregado, le damos click derecho y después en la opción Add seleccionamos Project Output... seleccionamos nuestro proyecto MiServicio y le damos en OK.


Ahora entramos al Custom Actions Editor seleccionando el proyecto Setup y dando click en el boton que se muestra.


Después con click derecho sobre Custom Actions seleccionamos Add Custom Action.


Aparecerá una ventana donde seleccionaremos Application Folder y OK.


Después seleccionamos Primary output from MiServicio(Active) y OK.


Y por último en las propiedades de Application Folder vamos a seleccionar la de DefaultLocation y asignaremos el valor [ProgramFilesFolder]\MiServicio con esto le definimos la ruta de donde se instalarán los archivos.


Compilamos y liiisstoooo!!!

Si todo salió bien y no tenemos ningún error entonces podemos proceder a Instalar el servicio.

Instalación del Servicio

Para instalar el servicio lo que debemos hacer es seleccionar el proyecto Setup, darle click derecho y seleccionar la opción Install

En seguida nos aparecerá la ventana del instalador a la cual le daremos click en Next a esta y todas las ventanas que aparezcan.

Si todo salió bien nos dirá que la instalación ha sido satisfactoria.

Ahora vamos al administrador de servicios y buscamos MiServicio.

Como verán el servicio no esta iniciado ya que se iniciará automáticamente al iniciar el SO, así que para probarlo lo iniciaremos manualmente.

Una vez iniciado podemos ir a buscar nuestro archivo log para verificar que el servicio este funcionando correctamente.

Con esto terminamos con este tema, en el siguiente post mostraré como aprovechar este Servicio para enviar correos electrónicos con diseño HTML.


30 comentarios:

  1. Amigo, muy bueno tu tutorial. Me interesaria ver la segunda parte enviar notificaciones via correo electrónico cada determinado tiempo.

    Gracias

    ResponderEliminar
  2. Claro que si! Por cuestiones de trabajo ya no le di seguimiento, pero déjame retomo esto, más tardar mañana podrás encontrarlo.

    Saludos!

    ResponderEliminar
  3. Buenas! He de decir que el tutoríal es muy muy bueno. Tan sólo una cuestión a ver si alguien puede echarme una mano. Sigo al pie de la letra todo lo que pone y al intentar instalarlo me dice: "Error 1001: Error en la instalación debido a que no hay ningún ServiceProcessInstaller. ServiceProcessInstaller debe estar presente en el instalador contenedor o en la colección de instaladores en el mismo instalador que ServiceInstaller". Muchas gracias

    ResponderEliminar
  4. Tengo el mismo error que reportó Bertín acá arriba, ¿alguien sabe cómo se resolvió?
    Saludos!

    ResponderEliminar
  5. Intenta eliminando el ServiceProcessInstaller y volviendo a agregar y configurar.

    Chécalo y me dices...

    ResponderEliminar
  6. Excelente, muy bien detallado.
    Gracias.

    ResponderEliminar
  7. Que tal tengo el mismo error 1001 y ya elimine el ServiceProcessInstaller y lo volví a agregar y nomas no jala, alguien ya lo soluciono.
    Saludos

    ResponderEliminar
  8. Tiene algo que ver que estoy trabajando en windows 8?

    ResponderEliminar
  9. Dudo mucho que sea W8, yo también lo tengo y no me manda el error, por desgracia no he podido replicarlo y no tengo la solución para ello.

    Mándame tu proyecto a noe.velazquez@outlook.com y le echo un vistazo...

    ResponderEliminar
  10. en otro foro encontre la solución, espero que les sirva.
    Saludos

    El problema estaba en que dentro de las propiedades del ServiceProcessinstaller no estaba puesto como padre el propio Service installer.....

    ResponderEliminar
    Respuestas
    1. tu solución no me dice nada :(

      Eliminar
    2. Tenia el mismo problema, y lo solucione reemplazando el siguiente código en el cs de Instalador.Designer.cs en la inicialización de componentes.

      this.Installers.AddRange(new System.Configuration.Install.Installer[] {
      this.serviceProcessInstaller1, this.serviceInstaller1});

      Fuente: http://stackoverflow.com/questions/2765313/windows-service-installation-problem

      Eliminar
    3. Muchas gracias Victor!

      En efecto esto resuelve el problema.

      Eliminar
  11. Me da mucho gusto que encontraras la solución y mejor aún que la compartas!

    Saludos!

    ResponderEliminar
  12. Gracias por compartir esta solución, muy buen aporte y limpia explicación.

    ResponderEliminar
  13. Me aparece este error: Windows no pudo iniciar servicio en equipo local"
    error 1053: El servicio no respondio a tiempo la solicitud de inicio o de control :/

    ResponderEliminar
  14. muy buen post, me ayudó mucho excelente :)

    ResponderEliminar
  15. disculpa no me aparece habilitada la opcion de install como puedo ejecutarlo entonces para poder instalar mi servicio es la primer aplicacion de servicios que hago asi que no tengo idea de como ejecutarlo

    ResponderEliminar
  16. Muchas gracias hermano me fue de mucha ayuda.

    Yo tambien tenia el mismo Error (1001) y lo solucione quitando del archivo "Custom Actions(Setup)" el Custom "Primary output from MiServicio (Active)" de las carpetas "Commit" y "Rollback" lo quite de esas 2 carpetas y me funciono

    ResponderEliminar
  17. Tengo el mismo error que Yuri error 1053

    ResponderEliminar
  18. Tengo el mismo error que Yuri error 1053

    ResponderEliminar
  19. Excelente tutorial
    ¿siempre si subiste la continuación en algún lugar?
    saludos…

    ResponderEliminar
  20. Tengo error 1001: Especificar valor de source...Qué puede ser??? :/ GRacias!

    ResponderEliminar
  21. Desinstalen en servicio desde programas e instalen de nuevo y se va el error

    ResponderEliminar
  22. por que el servicio no me funciona cuando me conecto a una base de datos?

    ResponderEliminar
  23. por que el servicio no me funciona cuando me conecto a una base de datos?

    ResponderEliminar
  24. Buenas tardes disculpen alguien me podria ayudar? ya al momento de instlarlo la opcion de instalar y desinstalar me aparecen desabilitadas podrian ayudarme porfavor

    ResponderEliminar
  25. Hola que tal, como creo un servicio que lo unico que haga sea iniciar una aplicacion... Lo necesito para que mi usuario no tenga necesidad de iniciar sesion para que corra el programa

    ResponderEliminar
  26. Harrah's Philadelphia - Casino News, Videos, Tickets & Videos
    Get ready to hit the jackpot 아산 출장마사지 at Harrah's Philadelphia, where hundreds of players from all around the United States 익산 출장안마 get to see their favorite games!Jan 23, 포천 출장샵 2022John FogertyJan 정읍 출장샵 24, 2022John 문경 출장마사지 Fogerty

    ResponderEliminar