net library example .net windows-services topshelf

.net - library - topshelf nuget



Instalar una aplicaciĆ³n Topshelf como un servicio de Windows (4)

Con Visual Studio Express 2012, he creado una aplicación de consola con Topshelf (versión 3.1.107.0). La aplicación funciona como una aplicación de consola, pero no puedo averiguar cómo instalarla como un servicio. He publicado el proyecto desde Visual Studio (Build, Publish), inicié un símbolo del sistema como Administrador, navegué hasta la carpeta donde se publicó la aplicación y ejecuté setup.exe -install desde el símbolo del sistema. La aplicación se instala y ejecuta, pero como una aplicación de consola, no un servicio de Windows. ¿Que me estoy perdiendo aqui?

Para aquellos que no estén familiarizados con Topshelf, es un marco de servicio de Windows para .Net y se supone que facilita el escenario que describo anteriormente: desarrollar y depurar como una aplicación de consola, implementar como un servicio de Windows. Consulte la documentación en http://docs.topshelf-project.com/en/latest/index.html .


  1. Inicie Visual Studio y cree una nueva aplicación de consola C #
  2. Haga clic derecho en las referencias y vaya a administrar NuGet-Packages
  3. Descargue e instale Topshelf a través de NuGet
  4. Pegue el Código a continuación en su aplicación e incluya todas las importaciones.
  5. Cambie del modo "Depurar" a "Liberar" y compile la aplicación.
  6. Ejecuta cmd.exe como administrador
  7. Navega por la consola para

    ./myConsoleApplication/bin/Release/

  8. Ejecuta el comando

    ./myConsoleApplication.exe install

  9. Ejecuta el comando

    ./myConsoleApplication.exe start

Código:

using System; using System.Threading; using Topshelf; using Topshelf.Runtime; namespace MyConsoleApplication { public class MyService { public MyService(HostSettings settings) { } private SemaphoreSlim _semaphoreToRequestStop; private Thread _thread; public void Start() { _semaphoreToRequestStop = new SemaphoreSlim(0); _thread = new Thread(DoWork); _thread.Start(); } public void Stop() { _semaphoreToRequestStop.Release(); _thread.Join(); } private void DoWork() { while (true) { Console.WriteLine("doing work.."); if (_semaphoreToRequestStop.Wait(500)) { Console.WriteLine("Stopped"); break; } } } } public class Program { public static void Main() { HostFactory.Run(x => { x.StartAutomatically(); // Start the service automatically x.EnableServiceRecovery(rc => { rc.RestartService(1); // restart the service after 1 minute }); x.Service<MyService>(s => { s.ConstructUsing(hostSettings => new MyService(hostSettings)); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription("MyDescription"); x.SetDisplayName("MyDisplayName"); x.SetServiceName("MyServiceName"); }); } } }


Busque la carpeta y ejecute el comando:

AppName.exe install

Debe ejecutar su línea de comandos como administrador.


Esta es una pregunta antigua, pero quiero agregar algunas opciones de línea de comandos.

Instalación de MyTopShelfImplementation.exe -servicename "MyServiceName" -displayname "My Display Name" --autostart start

.

--autoencendido

Es para cuando Windows se reinicia.

comienzo

es para iniciar el servicio INMEDIATAMENTE después de instalarlo

Ahora, los "nombres" también se pueden especificar en el código

HostFactory.Run(x => { ////x.SetDescription("My Description"); x.SetDisplayName("My Display Name"); x.SetServiceName("My Service Name"); ////x.SetInstanceName("My Instance");

Por lo tanto, si el archivo .exe se ejecuta como una aplicación de consola (o un servicio de Windows) puede ser una combinación de configuración de estos valores en el código y / o pasarlos a través de la línea de comandos.

Esperaría que si no configuró los "nombres" en el código Y no pasara los "nombres" en los argumentos de la línea de comandos, entonces obtendrá el comportamiento de la consola.