Cómo crear un servicio de Windows usando .NET
Creación de un servicio de Windows
El servicio que estamos a punto de crear no hace más que demostrar. Cuando se inicia un servicio, se registra una entrada en una base de datos para indicar que el servicio se ha iniciado. Mientras el servicio se ejecuta, crea periódicamente un registro de elemento de base de datos a intervalos específicos. El último registro de la base de datos se crea cuando se detiene el servicio. Este servicio se registra automáticamente en el Registro de aplicaciones de Windows cuando se inicia o se detiene correctamente.
Visual Studio .NET puede hacer que la creación de un servicio de Windows sea una cuestión bastante sencilla. Las instrucciones para iniciar nuestro servidor de demostración se describen a continuación.
1. Cree un nuevo proyecto
2. Seleccione el servicio de Windows de una lista de plantillas de proyecto disponibles
3. El diseñador se abrirá en modo de diseño
p>
p>
4. Arrastre un objeto Temporizador desde la lista de componentes de la caja de herramientas a la superficie de diseño (nota: asegúrese de usar el Temporizador de la lista de componentes y no de la lista de Windows Forms) p>
5. Establezca la propiedad Temporizador, la propiedad Habilitado en Falso y la propiedad Intervalo en 30000 milisegundos
6. Cambie a la página de vista de código (presione F7 o seleccione código en el menú de vista). ), y luego agregue funciones a este servicio
La composición de los servicios de Windows
En el código incluido detrás de su clase, notará que el servicio de Windows que creó extiende System.ServiceProcess .Clase de servicio. Todos los servicios de Windows creados en .NET deben ampliar esta clase. Le pedirá a su servicio que anule los siguientes métodos, que Visual Studio incluye de forma predeterminada. Dispose: borre todos los recursos administrados y no administrados (recursos administrados y no administrados) OnStart: controle el inicio del servicioOnStop: controle la parada del servicio
Ejemplo de script de tabla de base de datos
En este ejemplo, la tabla de base de datos utilizada fue creado usando el script T-SQL a continuación. Elijo la base de datos SQL Server. Puede modificar fácilmente este ejemplo para ejecutarlo en Access o cualquier otra base de datos de su elección.
CREAR TABLA [dbo].[MyServiceLog] (
[in_LogId] [int] IDENTIDAD (1, 1) NO NULL,
[vc_Status] [ nvarchar] (40)
COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[dt_Created] [datetime] NOT NULL
) ON [PRIMARY]
Muestra de servicio de Windows
El siguiente es todo el código fuente del servicio de Windows que llamé MyService. La mayor parte del código fuente lo genera automáticamente Visual Studio.
usando System;
usando System.Collections;
usando System.ComponentModel;
usando System.Data;
usando System.Data.SqlClient;
usando System.Diagnostics;
usando System.ServiceProcess;
espacio de nombres CodeGuru.MyWindowsService
{
clase pública MiServicio: System.ServiceProcess.ServiceBase
{
System.Timers.Timer privado temporizador1;
/ // lt; commentsgt;
/// Variable de diseñador requerida.
/// lt;/remarksgt;
private System.ComponentModel.Container componentes = null;
public MyService()
{
// Esta llamada es requerida por Windows.Forms
// Diseñador de componentes .
InitializeComponent();
}
// El punto de entrada principal para el proceso
static void Main() p>
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = nuevo System.ServiceProcess.ServiceBase[]
{ nuevo MiServicio( ) };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
/// resumengt; /// Método requerido para la compatibilidad con Designer: no modifique
/// el contenido de este método con el editor de código.
/// lt;/summarygt;
private void InitializeComponent()
{
this.timer1 = new System.Timers.Timer();
((System.ComponentModel. (ISupportInitialize)
<p>(this.timer1)).BeginInit();
//
// temporizador1
//
esto. timer1.Interval = 30000;
this.timer1.Elapsed =
new System.Timers.ElapsedEventHandler(this.timer1_Elapsed
//
// MiServicio
//
this.ServiceName = "Mi servicio de muestra";
((System.ComponentModel.ISupportInitialize) p>
(this.timer1)).EndInit();
}
/// lt; resumen
/// Limpiar cualquier recurso que se esté utilizando.
/// lt;/summarygt;
anulación protegida void Dispose( bool disposing)
{
if( desechar )
{
if (componentes != null)
{
componentes.Dispose();
}
}
base.Dispose( disposing);
}
/// resumengt; /p>
/// Pon todo en marcha para que tu servicio pueda hacer su trabajo.
/// lt;/summarygt;
protected override void OnStart(string[ ] args)
{
this.timer1.Enabled = true;
this.LogMessage("Servicio iniciado"
); }
/// lt;summarygt;
/// Detener este servicio.
/// lt;/summarygt;
anulación protegida void OnStop()
{
this.timer1.Enabled = false;
this.LogMessage("Servicio detenido");
}
/*
* Responder al evento transcurrido del temporizador cont
rol
*/
temporizador de vacío privado1_Elapsed(remitente del objeto,
System.Timers.ElapsedEventArgs e)
{
this.LogMessage("Service Running");
}
/*
* Registrar el mensaje especificado en la base de datos
*/
mensaje de registro vacío privado (mensaje de cadena)
{
conexión SqlConnection = nulo
comando SqlCommand = nulo ; p> p>
intentar
{
conexión = nueva SqlConnection(
"Servidor=localhost; Base de datos=SampleDatabase; Integrado
Seguridad=false;Id. de usuario=sa;Contraseña=;");
comando = new SqlCommand(
"INSERT INTO MyServiceLog (vc_Status, dt_Created)
VALUES ('" Mensaje "', getdate())", conexión);
conexión.Open();
int numrows = comando.ExecuteNonQuery(); p>
}
catch( Excepción ex )
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finalmente
{
comando.Dispose();
conexión.Dispose();
}
}
}
}
Instalación de servicios de Windows
Los servicios de Windows son diferentes de programa de aplicaciones ordinarias de Windows. No es posible iniciar un servicio de Windows simplemente ejecutando un EXE. La instalación de un servicio de Windows debe realizarse mediante InstallUtil.exe proporcionado por .NET Framework o mediante un proyecto de implementación de archivos como Microsoft Installer (MSI).
Añadir un programa de instalación de servicios
Crear un servicio de Windows No basta con instalar el servicio mediante el programa InstallUtil. También debe agregar un instalador de servicios a su servicio de Windows para que InstallUtil o cualquier otro instalador sepa qué ajustes de configuración se aplican a su servicio.
1. Cambie este programa de servicio a la vista de diseño
2. Haga clic derecho en la vista de diseño y seleccione "Agregar instalador"
3. Vista de diseño recién agregada de ProjectInstaller
4 Establezca las propiedades del componente serviceInstaller1:
1) ServiceName = Mi servicio de muestra
2) StartType = Automático<. /p>
5. Establecer las propiedades del componente serviceProcessInstaller1
1) Cuenta = LocalSystem
6. Generar la solución
Después de completar lo anterior. Pasos: Visual Studio generará automáticamente el siguiente código fuente, que se incluye en el archivo fuente ProjectInstaller.cs.
usando System;
usando System.Collections;
usando System.ComponentModel;
usando System.Configuration.Install; p>
usando System.Configuration.Install; p>
espacio de nombres CodeGuru.MyWindowsService
{
/// lt;summarygt;
/// Descripción resumida de ProjectInstaller.
///lt;/summarygt;
[RunInstaller(true)]
clase pública ProjectInstaller:
System.Configuration.Install.Installer
{
System.ServiceProcess.ServiceProcessInstaller privado
serviceProcessInstaller1;
Sistema privado .ServiceProcess.ServiceInstaller serviceInstaller1;
/// lt;summarygt;
/// Variable de diseñador requerida.
/// lt;/summarygt;
private System.ComponentModel.Container componentes = null;
public ProjectInstaller()
{
// Esta llamada es requerida por el Designer.
InitializeComponent() ;
// TODO: Agregar cualquier inicialización después de la llamada a InitComponent
}
#region Diseñador de componentes código generado
/// lt; resumengt;
/// Método requerido para el soporte del Diseñador - no modificar
/// el contenido de este método con el editor de código.
///lt;/summarygt;
private void InitializeComponent()
{
this.serviceProcessInstaller1 = nuevo
System.ServiceProcess .ServiceProcessInstaller();
this.serviceInstaller1 = nuevo
System.ServiceProcess.ServiceInstaller();
//
// serviceProcessInstaller1
//
this.serviceProcessInstaller1. Cuenta =
System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
//
// serviceInstaller1
//
this.serviceInstaller1.ServiceName = "Mi servicio de muestra"
this.serviceInstaller1.StartType =
System.ServiceProcess.ServiceStartMode.Automatic;
//
// ProjectInstaller
//
this.Installers.AddRange(new
System.Configuration.Install.Installer[]
{this.serviceProcessInstaller1, this.serviceInstaller1}); p>
p>
}
#endregion
}
}
Utilice InstallUtil para instalar servicios de Windows
Ahora que se ha generado el servicio, necesita instalarlo antes de poder usarlo. Los siguientes pasos lo guiarán en la instalación de su nuevo servicio.
1. Abra el símbolo del sistema de Visual Studio .NET
2. Cambie la ruta a la ubicación de la carpeta bin\Debug donde se encuentra su proyecto (si compila en modo de lanzamiento, estará en la carpeta bin\Release)
3. Ejecute el comando "InstallUtil.exe MyWindowsService.exe" para registrar este servicio y crear un elemento de registro adecuado.
4. Haga clic derecho en "Mi PC" en el escritorio y seleccione "Administrar" para abrir la consola de administración de la computadora.
5 En "Servicios y aplicaciones", haga clic en "Servicios". ”, puede encontrar que su servicio de Windows está incluido en la lista de servicios
6. Haga clic derecho en su servicio y seleccione Iniciar para iniciar su servicio
En cada uno de ellos La primera vez. Si necesita modificar un servicio de Windows, esto requerirá que desinstale y reinstale el servicio. Sin embargo, tenga en cuenta que antes de desinstalar este servicio, es mejor asegurarse de que la consola de administración de servicios esté cerrada. Este es un buen hábito. Si no hace esto, puede tener problemas para desinstalar y reinstalar los servicios de Windows. Si desea desinstalar solo el servicio, puede ejecutar el comando InstallUtil correspondiente para cerrar sesión en el servicio, pero debe agregar un modificador de comando /u al final.
Depurar servicios de Windows
Desde otra perspectiva, depurar servicios de Windows es definitivamente diferente a una aplicación normal. La depuración de los servicios de Windows requiere más pasos. Los servicios no se pueden depurar simplemente ejecutándolos en un entorno de desarrollo como se puede hacer con una aplicación normal. Primero hay que instalar e iniciar el servicio, cosa que ya hemos hecho en el apartado anterior. Para facilitar el seguimiento y la depuración del código, una vez iniciado el servicio, debe utilizar Visual Studio para adjuntar el proceso en ejecución. Recuerde, cualquier cambio que realice en su servicio de Windows requerirá desinstalar y reinstalar el servicio.
Adjunte un servicio de Windows en ejecución
Para depurar el programa, hay instrucciones para adjuntar un servicio de Windows. Estas operaciones suponen que tiene este servicio de Windows instalado y que se está ejecutando.
1. Cargue este proyecto con Visual Studio
2. Haga clic en el menú "Depurar"
3. Haga clic en el menú "Procesar". p> 4. Asegúrese de que Mostrar procesos del sistema esté seleccionado
5 En la lista de procesos disponibles, ubique el proceso sobre el nombre de su archivo ejecutable y haga clic para seleccionarlo
6. Haga clic en el botón Adjuntar
7. Haga clic en Aceptar
8. Haga clic en Cerrar
9. /p>
Resumen
Ahora debería tener una idea aproximada de qué son los servicios de Windows y cómo crearlos, instalarlos y depurarlos. Puede estudiar las funciones de los servicios de Windows usted mismo. Estas características incluyen la capacidad de pausar (OnPause) y reanudar (OnContinue). La capacidad de pausar y reanudar no está habilitada de forma predeterminada y debe configurarse a través de las propiedades del servicio de Windows.