Saltar al contenido

Aplicación de consola .NET como servicio de Windows

Haz todo lo posible por entender el código bien antes de adaptarlo a tu proyecto si ttienes algo que aportar puedes dejarlo en la sección de comentarios.

Solución:

Usualmente uso la siguiente técnica para ejecutar la misma aplicación como una aplicación de consola o como un servicio:

public static class Program

    #region Nested classes to support running as service
    public const string ServiceName = "MyService";

    public class Service : ServiceBase
    
        public Service()
        
            ServiceName = Program.ServiceName;
        

        protected override void OnStart(string[] args)
        
            Program.Start(args);
        

        protected override void OnStop()
        
            Program.Stop();
        
    
    #endregion

    static void Main(string[] args)
    
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        
    

    private static void Start(string[] args)
    
        // onstart code here
    

    private static void Stop()
    
        // onstop code here
    

Environment.UserInteractive es normalmente true para la aplicación de consola y false por un servicio Técnicamente, es posible ejecutar un servicio en modo interactivo con el usuario, por lo que podría marcar un interruptor de línea de comandos en su lugar.

He tenido un gran éxito con TopShelf.

TopShelf es un paquete de Nuget diseñado para facilitar la creación de aplicaciones de Windows .NET que pueden ejecutarse como aplicaciones de consola o como servicios de Windows. Puede conectar rápidamente eventos como los eventos de inicio y detención de su servicio, configurar mediante código, por ejemplo, para configurar la cuenta con la que se ejecuta, configurar dependencias en otros servicios y configurar cómo se recupera de los errores.

Desde la Consola del administrador de paquetes (Nuget):

Estante superior del paquete de instalación

Consulte los ejemplos de código para comenzar.

Ejemplo:

HostFactory.Run(x =>                                 

    x.Service(s =>                        
    
       s.ConstructUsing(name=> new TownCrier());     
       s.WhenStarted(tc => tc.Start());              
       s.WhenStopped(tc => tc.Stop());               
    );
    x.RunAsLocalSystem();                            

    x.SetDescription("Sample Topshelf Host");        
    x.SetDisplayName("Stuff");                       
    x.SetServiceName("stuff");                       
); 

TopShelf también se encarga de la instalación del servicio, lo que puede ahorrar mucho tiempo y elimina el código repetitivo de su solución. Para instalar su .exe como un servicio, simplemente ejecute lo siguiente desde el símbolo del sistema:

myservice.exe install -servicename "MyService" -displayname "My Service" -description "This is my service."

No necesita conectar un ServiceInstaller y todo eso: TopShelf lo hace todo por usted.

Así que aquí está el tutorial completo:

  1. Crear un nuevo proyecto de aplicación de consola (p. ej., MyService)
  2. Agregue dos referencias de biblioteca: System.ServiceProcess y System.Configuration.Install
  3. Agregue los tres archivos impresos a continuación
  4. Genere el proyecto y ejecute “InstallUtil.exe c:pathtoMyService.exe”
  5. Ahora debería ver MyService en la lista de servicios (ejecutar services.msc)

*InstallUtil.exe generalmente se puede encontrar aquí: C:windowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.ex‌​e

Programa.cs

using System;
using System.IO;
using System.ServiceProcess;

namespace MyService

    class Program
    
        public const string ServiceName = "MyService";

        static void Main(string[] args)
        
            if (Environment.UserInteractive)
            
                // running as console app
                Start(args);

                Console.WriteLine("Press any key to stop...");
                Console.ReadKey(true);

                Stop();
            
            else
            
                // running as service
                using (var service = new Service())
                
                    ServiceBase.Run(service);
                
            
        

        public static void Start(string[] args)
        
            File.AppendAllText(@"c:tempMyService.txt", String.Format("0 started1", DateTime.Now, Environment.NewLine));
        

        public static void Stop()
        
            File.AppendAllText(@"c:tempMyService.txt", String.Format("0 stopped1", DateTime.Now, Environment.NewLine));
        
    

MiServicio.cs

using System.ServiceProcess;

namespace MyService

    class Service : ServiceBase
    
        public Service()
        
            ServiceName = Program.ServiceName;
        

        protected override void OnStart(string[] args)
        
            Program.Start(args);
        

        protected override void OnStop()
        
            Program.Stop();
        
    

MyServiceInstaller.cs

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace MyService

    [RunInstaller(true)]
    public class MyServiceInstaller : Installer
    
        public MyServiceInstaller()
        
            var spi = new ServiceProcessInstaller();
            var si = new ServiceInstaller();

            spi.Account = ServiceAccount.LocalSystem;
            spi.Username = null;
            spi.Password = null;

            si.DisplayName = Program.ServiceName;
            si.ServiceName = Program.ServiceName;
            si.StartType = ServiceStartMode.Automatic;

            Installers.Add(spi);
            Installers.Add(si);
        
    

Valoraciones y reseñas

Te invitamos a patrocinar nuestra investigación añadiendo un comentario o dejando una puntuación te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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