1. Crear un nuevo proyecto de servicio de Windows
- Abre Visual Studio y crea un proyecto nuevo
- Selecciona la plantilla: Visual C# → Windows → Servicio de Windows
- 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:
- Program.cs: punto de entrada de la aplicación
- 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 negocioOnStop: 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
- En la vista de diseño de
Service1, haz clic derecho → Agregar instalador - Visual Studio genera automáticamente
ProjectInstaller.cscon dos componentes esenciales:serviceInstaller1serviceProcessInstaller1

Configuración de propiedades de los componentes
- serviceInstaller1 (configuración de información del servicio)
ServiceName: nombre interno del servicio (identificador en código)DisplayName: nombre visible en el administrador de serviciosDescription: descripción del servicioStartType: tipo de arranqueManual(Manual)/Automatic(Automático)
- serviceProcessInstaller1 (configuración de cuenta de ejecución)
Account: identidad de ejecuciónLocalSystem: 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
- Compila el proyecto y obtén
WindowsServiceDemo.exe - 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)
- 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
- 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. - Problemas con rutas: Las rutas relativas no funcionan, utiliza preferiblemente rutas absolutas.
- Problemas de permisos: La cuenta de ejecución define el acceso a disco, red y carpetas compartidas.
- Tiempo de espera al arranque: Un bloqueo prolongado dentro de
OnStarthará que el sistema marque el arranque como fallido. Las tareas pesadas deben ejecutarse en un hilo independiente.
Tu primer Windows Service