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:
- Crear un nuevo proyecto de aplicación de consola (p. ej., MyService)
- Agregue dos referencias de biblioteca: System.ServiceProcess y System.Configuration.Install
- Agregue los tres archivos impresos a continuación
- Genere el proyecto y ejecute “InstallUtil.exe c:pathtoMyService.exe”
- 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.exe
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.