2013-08-13 19 views
40

Utilizzo di Visual Studio Express 2012, ho creato un'applicazione console utilizzando Topshelf (versione 3.1.107.0). L'applicazione funziona come un'applicazione console, ma non riesco a capire come installarlo come servizio. Ho pubblicato il progetto da Visual Studio (Build, Publish), avviato un prompt dei comandi come amministratore, navigato nella cartella in cui è stata pubblicata l'applicazione ed eseguito setup.exe -install dal prompt dei comandi. L'applicazione è installata e viene eseguita, ma come applicazione console, non come servizio Windows. Cosa mi manca qui?Installazione di un'applicazione Topshelf come servizio Windows

Per coloro che potrebbero non avere familiarità con Topshelf, è un framework di servizio Windows per .Net e si suppone che faciliti lo scenario descritto sopra: sviluppo e debug come applicazione console, distribuire come servizio Windows. Vedere la documentazione allo http://docs.topshelf-project.com/en/latest/index.html.

+8

Ho esaminato la domanda "Crea servizio Windows da eseguibile". Non sembra pertinente alla mia domanda, in quanto non riguarda Topshelf. –

+2

Sì, questo è quello che fa Topshelf, e sì, ho ricercato la loro documentazione. –

+0

Bene cosa hai trovato? Come apparentemente sembra che tu abbia problemi a seguire la loro documentazione, specialmente in _ "L'applicazione è installata e funziona, ma come applicazione console, non un servizio Windows" _. Vede il servizio installato nello snap-in MMC Servizi di Windows? – CodeCaster

risposta

56

Eseguire il servizio service.exe install per l'installazione.

Vedere la documentazione Topshelf Command Line Reference per ulteriori informazioni.

+0

Grazie! Il mio errore è stato che stavo cercando di installare il setup.exe creato quando ho pubblicato l'applicazione, quando avrei dovuto installare il file servicename.exe nella cartella bin \ release! Doh! Tutto funziona ora. –

24
  1. Avviare Visual Studio e creare un nuovo C# console-Applicazione
  2. clic destro su riferimenti e andare a gestire Nuget-Packages
  3. scaricare e installare TopShelf tramite NuGet
  4. Incollare il codice qui sotto nella vostra applicazione e includere tutte le importazioni.
  5. Passare dalla modalità "Debug" a "Rilascio" e creare l'applicazione.
  6. Esegui come amministratore cmd.exe
  7. Naviga la console per

    .\myConsoleApplication\bin\Release\ 
    
  8. Eseguire il comando

    .\myConsoleApplication.exe install 
    
  9. Eseguire il comando

    .\myConsoleApplication.exe start 
    

Codice:

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");  

      });             
     } 
    } 
} 
7

Passare alla cartella ed eseguire il comando:

AppName.exe install 

Devi eseguire il prompt dei comandi come amministratore.

+0

3 anni di ritardo .... non aggiunge alcun valore aggiuntivo –

0

Quindi questa è una vecchia domanda, ma voglio aggiungere alcune opzioni della riga di comando.

MyTopShelfImplementation.exe installare -SERVICENAME "MyServiceName" -DisplayName "My Display Name" --autostart iniziare

.

--autostart

è per quando le finestre si riavvia.

inizio

è per l'avvio del servizio subito dopo averlo installato

Ora, i "nomi" è anche possibile specificare nel codice

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

Quindi, se il. exe viene eseguito come app per console (o come servizio Windows) può essere una combinazione di impostare questi valori nel codice e/o passarli attraverso la riga di comando.

Mi aspetterei se non si impostassero i "nomi" nel codice E non si siano passati i "nomi" in args da riga di comando, quindi si otterrà il comportamento della console.