Lenguaje más sencillo para crear un servicio de Windows

Resuelto UnkwnTech asked hace 15 años • 6 respuestas

¿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.

UnkwnTech avatar Feb 27 '09 10:02 UnkwnTech
Aceptado

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:

  1. Abra Visual Studio 2008 y seleccione la opción de menú File-> New-> Project.
  2. 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
  3. 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 el System.ServiceProcess.ServiceBasecomponente que es su nuevo servicio de Windows.
  4. En el Property Grid de su Service1componente, considere establecer las siguientes propiedades como mínimo:
    • (Nombre): dale a tu objeto un nombre intuitivo, por ejemplo,ServiceExample
    • AutoLog- configúrelo falsepara 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 en truesi desea manejar los apagados del sistema
    • ServiceName- define el nombre por el cual el Administrador de control de servicios (SCM) conocerá su servicio
  5. En el código para ServiceExample, las funciones virtuales OnStart()y OnStop()están eliminadas. Obviamente, deberá completarlos con lo que sea que su servicio deba hacer. Si cambió la CanShutdownpropiedad a , también truequerrá anular el método. OnShutdownHe creado un ejemplo a continuación que ilustra el uso de estas funciones.
  6. En este punto, el ServiceExampleservicio está esencialmente completo, pero aún necesita una forma de instalarlo. Para hacer esto, abra el ServiceExamplecomponente 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 un ProjectInstallercomponente a su proyecto, que contiene dos componentes adicionales: serviceProcessInstaller1y serviceInstaller1.
  7. Seleccione el serviceProcessInstaller1componente 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 LocalServicecuenta como mínimo, pero es posible que deba usar la cuenta NetworkServiceo LocalSystemsi su servicio requiere más privilegios.
  8. 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 servicio
    • ServiceName- asegúrese de que sea el mismo nombre que seleccionó para la ServiceNamepropiedad de su ServiceExamplecomponente (consulte el Paso 4)
    • StartType- indique si desea que el servicio se inicie automáticamente o manualmente
  9. 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 EventLogInstallerpor ProjectInstalleruno personalizado. Haz que tu código se ProjectInstallervea 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 ServiceExampleregistro 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 EventLogconstructor ServiceExample. Cuando ejecute su servicio, sus mensajes de registro aparecerán en el registro de eventos de la aplicación.

Matt Davis avatar Feb 27 '2009 07:02 Matt Davis

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.

Richard B avatar Feb 27 '2009 05:02 Richard B