Lenguaje más sencillo para crear un servicio de Windows
¿Cuál es el lenguaje más sencillo para crear servicios de Windows?
Lo más fácil en este caso se definiría como la menor cantidad de código y el punto de entrada más bajo al idioma.
A riesgo de decir lo obvio, si tiene experiencia en C/C++/Java, creo que C# le ofrece el punto de entrada más bajo.
Suponiendo que esté utilizando Visual Studio 2008, puede seguir estos pasos:
- Abra Visual Studio 2008 y seleccione la opción de menú File-> New-> Project.
- En el cuadro de diálogo Nuevo proyecto...
- Seleccione el nodo Visual C#|Windows en Tipos de proyecto
- Seleccione la plantilla de servicio de Windows
- Ingrese un nombre y ubicación para su proyecto
- presiona OK
- En este punto, tienes todos los conceptos básicos para tu servicio de Windows. El archivo Program.cs contiene el
Main()
método para su servicio y Service1.cs define elSystem.ServiceProcess.ServiceBase
componente que es su nuevo servicio de Windows. - En el Property Grid de su
Service1
componente, considere establecer las siguientes propiedades como mínimo:- (Nombre): dale a tu objeto un nombre intuitivo, por ejemplo,
ServiceExample
AutoLog
- configúrelofalse
para evitar que los eventos se escriban de forma predeterminada en el registro de eventos de la aplicación (Nota: no estoy diciendo que no deba registrar eventos de servicio; simplemente prefiero escribir en mi propio registro de eventos en lugar del registro de la aplicación; consulte a continuación)CanShutdown
- configúrelo entrue
si desea manejar los apagados del sistemaServiceName
- define el nombre por el cual el Administrador de control de servicios (SCM) conocerá su servicio
- (Nombre): dale a tu objeto un nombre intuitivo, por ejemplo,
- En el código para
ServiceExample
, las funciones virtualesOnStart()
yOnStop()
están eliminadas. Obviamente, deberá completarlos con lo que sea que su servicio deba hacer. Si cambió laCanShutdown
propiedad a , tambiéntrue
querrá anular el método.OnShutdown
He creado un ejemplo a continuación que ilustra el uso de estas funciones. - En este punto, el
ServiceExample
servicio está esencialmente completo, pero aún necesita una forma de instalarlo. Para hacer esto, abra elServiceExample
componente en el diseñador. Haga clic derecho en cualquier parte del panel del diseñador y seleccione la opción de menú Agregar instalador. Esto agrega unProjectInstaller
componente a su proyecto, que contiene dos componentes adicionales:serviceProcessInstaller1
yserviceInstaller1
. - Seleccione el
serviceProcessInstaller1
componente en el diseñador. En Property Grid, considere configurar las siguientes propiedades:- (Nombre): dale a tu objeto un nombre intuitivo, por ejemplo,
serviceProcessInstaller
- Cuenta: seleccione la
LocalService
cuenta como mínimo, pero es posible que deba usar la cuentaNetworkService
oLocalSystem
si su servicio requiere más privilegios.
- (Nombre): dale a tu objeto un nombre intuitivo, por ejemplo,
- Seleccione el componente serviceInstaller1 en el diseñador. En Property Grid, considere configurar las siguientes propiedades:
- (Nombre): le da al objeto un nombre intuitivo, por ejemplo,
serviceInstaller
- Descripción: la descripción del servicio que aparecerá en el SCM de su servicio.
DisplayName
- el nombre descriptivo de su servicio que aparecerá en el SCM de su servicioServiceName
- asegúrese de que sea el mismo nombre que seleccionó para laServiceName
propiedad de suServiceExample
componente (consulte el Paso 4)StartType
- indique si desea que el servicio se inicie automáticamente o manualmente
- (Nombre): le da al objeto un nombre intuitivo, por ejemplo,
- Recuerde que dije que prefiero escribir eventos en mi propio registro de eventos en lugar del registro de eventos de la aplicación. Para hacer esto, deberá reemplazar el valor predeterminado
EventLogInstaller
porProjectInstaller
uno personalizado. Haz que tu código seProjectInstaller
vea así:
using System.Diagnostics;
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
EventLogInstaller installer = FindInstaller(this.Installers);
if (installer != null)
{
installer.Log = "ServiceExample"; // enter your event log name here
}
}
private EventLogInstaller FindInstaller(InstallerCollection installers)
{
foreach (Installer installer in installers)
{
if (installer is EventLogInstaller)
{
return (EventLogInstaller)installer;
}
EventLogInstaller eventLogInstaller = FindInstaller(installer.Installers);
if (eventLogInstaller != null)
{
return eventLogInstaller;
}
}
return null;
}
}
En este punto, puede construir su proyecto para obtener el ejecutable de su servicio de Windows. Para instalar su servicio, abra el símbolo del sistema de Visual Studio 2008 y navegue hasta el directorio Debug o Release donde se encuentra su ejecutable. En el símbolo del sistema, escriba lo siguiente: InstallUtil ServiceExample.exe . Esto instalará su servicio en la máquina local. Para desinstalarlo, escriba lo siguiente en el símbolo del sistema: InstallUtil /u ServiceExample.exe
Mientras su servicio no se esté ejecutando, puede realizar cambios en su servicio y reconstruirlo, es decir, no tiene que desinstalar su servicio para realizar cambios. Sin embargo, no podrá sobrescribir el ejecutable con sus correcciones y mejoras mientras esté ejecutándose.
Para ver su servicio en acción, abra el archivo ServiceExample.cs y realice los siguientes cambios:
using System.Diagnostics;
public partial class ServiceExample : ServiceBase
{
public ServiceExample()
{
// Uncomment this line to debug the service.
//Debugger.Break();
InitializeComponent();
// Ties the EventLog member of the ServiceBase base class to the
// ServiceExample event log created when the service was installed.
EventLog.Log = "ServiceExample";
}
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("The service was started successfully.", EventLogEntryType.Information);
}
protected override void OnStop()
{
EventLog.WriteEntry("The service was stopped successfully.", EventLogEntryType.Information);
}
protected override void OnShutdown()
{
EventLog.WriteEntry("The service was shutdown successfully", EventLogEntryType.Information);
}
}
Una vez que ejecute su servicio con estos cambios, podrá consultar el ServiceExample
registro de eventos en el Visor de eventos y ver los mensajes registrados allí.
EDITAR: Si prefiere utilizar el registro de eventos de la aplicación para su registro de eventos en lugar de uno personalizado, simplemente no realice cambios en el archivo ProjectInstaller.cs . Además, omita la línea que establece la propiedad Log del EventLog
constructor ServiceExample
. Cuando ejecute su servicio, sus mensajes de registro aparecerán en el registro de eventos de la aplicación.
Estoy de acuerdo con todos los que han respondido en otros lugares, pero yo diría que no se concentre demasiado en el lenguaje real, siempre que esté trabajando en el marco .NET y haya un proyecto inicial para usted, está bien. ir. He realizado varios "servicios de Windows" en el pasado y los desarrollé tanto en VB.NET como en C#, con un código mínimo.
Lo que recomendaría al OP es aprender a crear el paquete de instalación correspondiente. Instalar el servicio es tan fácil como ejecutar "installutil.exe {unidad}\path\to\file.exe", pero cuando tienes que hacer algo más grande que implementar un servicio de Windows "hola mundo", es bueno saber y comprender cómo implementar el servicio de manera significativa.
No quiero iniciar una guerra de llamas, pero me he "estandarizado" en el uso de WiX para todos mis paquetes de implementación, aparte de hacer cosas del tipo de interoperabilidad COM de la vieja escuela, ya que es mucho trabajo instalarlo correctamente. Estoy ansioso por que el equipo de WiX desarrolle el programa previo que le permita colocar los requisitos previos y el msi principal en un archivo EXE que se pueda descargar. Lo tienen programado para la versión 3.5, así que esperaré pacientemente y usaré los ejecutables autoextraíbles de WinZip por ahora.