servicios servicio llamar instalar instalador ejecutar desde depurar crear como aplicacion agregar c# windows-services

llamar - ejecutar aplicacion desde servicio de windows c#



Ejecutar un servicio de Windows como una aplicaciĆ³n de consola (4)

Antes de que un servicio de Windows pueda ejecutarse, primero debe "instalarse" utilizando installutil. P.EJ:

C:/installutil -i c:/path/to/project/debug/service.exe

Luego puedes abrir la lista de Servicios para iniciarla. P.EJ:

  1. Haga clic derecho en ''Mi PC''
  2. Haga clic en ''Gestionar''
  3. Abre ''Servicios y Aplicaciones''
  4. Haga clic en ''Servicios''
  5. Encuentra tu servicio en la lista y haz clic derecho en él
  6. Haga clic en ''Inicio''

Una vez que haya comenzado, puede ingresar a Visual Studio, hacer clic en ''Depurar'', luego hacer clic en ''Adjuntar al proceso''.

Otra técnica es agregar esta línea a su método OnStart () en el servicio:

System.Diagnostics.Debugger.Launch();

Cuando haga eso, le pedirá que elija una instancia de Visual Studio para depurar el servicio.

Quiero depurar un servicio de Windows pero aparece un mensaje de error que dice

No se puede iniciar el servicio desde la línea de comandos o un depurador. Se debe instalar un servicio de Windows con installutil.exe y luego iniciar con el Explorador del servidor, las herramientas administrativas de los servicios de Windows o el comando de inicio de NET.

Realmente no tengo idea de este error ...


Para evitar que se produzca este error y permitir que el servicio se ejecute fuera del controlador de servicio habitual, puede verificar el indicador Environment.UserInteractive . Si está configurado, puede ejecutar el servicio con salida en la consola en lugar de dejar que se ejecute en el código de ServiceBase que devuelve ese error.

Agregue esto al inicio de Program.Main (), antes del código que usa ServiceBase para ejecutar el servicio:

if (Environment.UserInteractive) { var service = new WindowsService(); service.TestInConsole(args); return; }

Como los métodos OnStart y OnStop están protected en su servicio, debe agregar otro método a esa clase que puede ejecutar desde Main () y llamar a esos métodos por usted, como:

public void TestInConsole(string[] args) { Console.WriteLine($"Service starting..."); this.OnStart(args); Console.WriteLine($"Service started. Press any key to stop."); Console.ReadKey(); Console.WriteLine($"Service stopping..."); this.OnStop(); Console.WriteLine($"Service stopped. Closing in 5 seconds."); System.Threading.Thread.Sleep(5000); }

Finalmente, asegúrese de que la salida sea una aplicación de consola en las propiedades del proyecto.

Ahora puede ejecutar el servicio ejecutable como cualquier otro y se iniciará como una consola. Si lo inicia desde Visual Studio, el depurador se adjuntará automáticamente. Si lo registra y lo inicia como un servicio, se ejecutará correctamente como un servicio sin ningún cambio.

La única diferencia que he encontrado es que cuando se ejecuta como una aplicación de consola, el código no se escribe en el registro de eventos, es posible que desee generar cualquier cosa que normalmente se registraría allí en la consola.

Esta técnica de depuración del servicio es una de las explicadas en docs.microsoft.com


Por favor, compruebe si está en modo "DEBUG" o "RELEASE". Recibí este error cuando intentaba depurar el servicio en el modo "LIBERAR". Cuando cambié eso a "DEBUG", todo funcionó bien.

Esto es después de haber instalado correctamente el servicio como lo sugieren otras personas arriba.


Puede alterar el modo de inicio del ensamblaje en función de si está en modo DEBUG (generalmente dentro de Visual Studio pero no necesariamente) o en el modo RELEASE (cuando se ejecuta como un servicio en producción):

Cambia esto:

static class Program { static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MyService() }; ServiceBase.Run(ServicesToRun); } }

a ese:

static class Program { static void Main() { #if(!DEBUG) ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MyService() }; ServiceBase.Run(ServicesToRun); #else MyService myServ = new MyService(); myServ.Process(); // here Process is my Service function // that will run when my service onstart is call // you need to call your own method or function name here instead of Process(); #endif } }

La técnica se toma de este artículo y el crédito es para el autor del artículo, Tejas Vaishnav. Copié los fragmentos de código aquí porque SO favorece las respuestas completas en lugar de los enlaces que pueden desaparecer en algún momento.