Para evitar que se produzca este error y permitir que el servicio se ejecute fuera del controlador de servicio habitual, puede marcar Environment.UserInteractive
. Si está configurado, puede ejecutar el servicio con salida a la consola en lugar de dejar que se ejecute en el código ServiceBase que devuelve ese error.
Esto, unido al inicio de Program.Main(), antes de que el código que utiliza ServiceBase para ejecutar el servicio:
if (Environment.UserInteractive)
{
var service = new WindowsService();
service.TestInConsole(args);
return;
}
A medida que el OnStart y métodos OnStop son protected
en su servicio que necesita añadir otro método de la clase que se puede ejecutar desde main() y llama a esos métodos para usted, tales 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);
}
por último, asegúrese de que la salida es 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 mostrar cualquier cosa que normalmente se registre allí a la consola.
Esta técnica de depuración servicio es uno de los que se explica en docs.microsoft.com
Podría haber jurado que [acabo de ver un post como este] (http://stackoverflow.com/questions/5156427/how-do-you-debug -a-windows-service) –