Tu primer Windows Service

1. Crear un nuevo proyecto de servicio de Windows

  1. Abre Visual Studio y crea un proyecto nuevo
  2. Selecciona la plantilla: Visual C# → Windows → Servicio de Windows
  3. Establece el nombre del proyecto y la ruta de guardado y pulsa Aceptar

Nota: Las versiones más recientes de Visual Studio ya no incluyen esta plantilla. Solo es compatible con .NET Framework. Para .NET Core/.NET 5+, se recomienda usar Worker Service.

2. Descripción de la estructura del proyecto

Archivos principales generados automáticamente:

  1. Program.cs: punto de entrada de la aplicación
  2. Service1.cs: clase con la lógica principal del servicio
1. Código de entrada Program.cs
static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service1()
        };
        ServiceBase.Run(ServicesToRun);
    }
}Lenguaje del código: JavaScript (javascript)

Función: inicia el contenedor de servicios y carga una o varias instancias de servicio.

2. Clase principal del servicio Service1.cs
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    // Se ejecuta cuando arranca el servicio
    protected override void OnStart(string[] args)
    {

    }

    // Se ejecuta cuando se detiene el servicio
    protected override void OnStop()
    {

    }
}
  • OnStart: se dispara al iniciar el servicio, coloca aquí tu lógica de negocio
  • OnStop: se dispara al detener el servicio, sirve para liberar recursos

3. Agregar instalador

Este paso es obligatorio. Sin él no podrás registrar el servicio en el sistema.

Pasos de operación
  1. En la vista de diseño de Service1, haz clic derecho → Agregar instalador
  2. Visual Studio genera automáticamente ProjectInstaller.cs con dos componentes esenciales:
    • serviceInstaller1
    • serviceProcessInstaller1

Configuración de propiedades de los componentes

  1. serviceInstaller1 (configuración de información del servicio)
    • ServiceName: nombre interno del servicio (identificador en código)
    • DisplayName: nombre visible en el administrador de servicios
    • Description: descripción del servicio
    • StartType: tipo de arranque Manual(Manual)/Automatic(Automático)
  2. serviceProcessInstaller1 (configuración de cuenta de ejecución)
    • Account: identidad de ejecución
    • LocalSystem: cuenta del sistema local (máximos permisos, recomendada para pruebas)
    • User: cuenta de Windows personalizada (predeterminado, requiere usuario y contraseña)

4. Escribir lógica de negocio de prueba

Toda la lógica de negocio va dentro de Service1. Puedes colocar tu código aquí. Como los servicios son complicados de depurar, usamos temporalmente salidas de registro para comprobar su funcionamiento. El servicio requiere instalación y desinstalación.

Modifica el archivo Service1.cs

using System.IO;

protected override void OnStart(string[] args)
{
    // Escribir registro al iniciar
    File.AppendAllText("log.txt", "Hora de inicio: " + DateTime.Now + Environment.NewLine);
}

protected override void OnStop()
{
    // Escribir registro al detener
    File.AppendAllText("log.txt", "Hora de parada: " + DateTime.Now + Environment.NewLine);
}Lenguaje del código: JavaScript (javascript)

5. Compilar, instalar y arrancar el servicio

  1. Compila el proyecto y obtén WindowsServiceDemo.exe
  2. Registra el servicio mediante InstallUtil.exe (símbolo del sistema como administrador)
# Instalar servicio
InstallUtil.exe WindowsServiceDemo.exe

# Desinstalar servicio
InstallUtil.exe /u WindowsServiceDemo.exeLenguaje del código: PHP (php)
  1. Abre el administrador de servicios con services.msc, busca el servicio, arráncalo o detenlo y revisa el archivo de registro.

Los servicios no se pueden ejecutar ni depurar como programas normales. Deben instalarse con herramientas especializadas.

Observaciones importantes

  1. No se puede depurar directamente con F5: Los servicios de Windows no admiten depuración directa. Solución recomendada:
    implementa un modo dual; se ejecuta como aplicación consola desde línea de comandos y como servicio después de instalarlo.
  2. Problemas con rutas: Las rutas relativas no funcionan, utiliza preferiblemente rutas absolutas.
  3. Problemas de permisos: La cuenta de ejecución define el acceso a disco, red y carpetas compartidas.
  4. Tiempo de espera al arranque: Un bloqueo prolongado dentro de OnStart hará que el sistema marque el arranque como fallido. Las tareas pesadas deben ejecutarse en un hilo independiente.

Tu primer Windows Service

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *