Domanda Installazione di un'applicazione Topshelf come servizio di Windows


Utilizzando Visual Studio Express 2012, ho creato un'applicazione console usando 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?

Per coloro che potrebbero non avere familiarità con Topshelf, si tratta di 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. Vedi la documentazione a http://docs.topshelf-project.com/en/latest/index.html.


44
2017-08-13 10:30


origine


risposte:


Esegui il tuo service.exe install per installare il servizio.

Vedere il Riferimento della riga di comando Topshelf documentazione per ulteriori informazioni.


62
2017-08-13 11:43



  1. Avvia Visual Studio e crea una nuova console C-Application
  2. Fare clic con il tasto destro sui riferimenti e andare a gestire i pacchetti NuGet
  3. Scarica e installa Topshelf via NuGet
  4. Incolla il codice qui sotto nella tua applicazione e includi tutte le importazioni.
  5. Passa dalla modalità "Debug" a "Rilascia" e crea l'applicazione.
  6. Correre cmd.exe come amministratore
  7. Spostare la console su

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

    .\myConsoleApplication.exe install
    
  9. Esegui 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");    

            });                                                 
        }
    }
}

25
2018-03-29 12:12



Passare alla cartella ed eseguire il comando:

AppName.exe install

È necessario eseguire il prompt dei comandi come amministratore.


8
2018-05-10 08:53



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

MyTopShelfImplementation.exe install -servicename "MyServiceName"   -displayname "My Display Name" --autostart start

.

--avvio automatico

è per quando Windows si riavvia.

inizio

è per avviare il servizio IMMEDIATAMENTE dopo averlo installato

Ora, i "nomi" è possibile specificare anche 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 file .exe viene eseguito come app per console (o come servizio Windows) potrebbe 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 fossero passati i "nomi" in args da riga di comando, quindi si otterrà il comportamento della console.


1
2017-11-01 20:07