Installieren einer Topshelf-Anwendung als Windows-Dienst

70

Mit Visual Studio Express 2012 habe ich eine Konsolenanwendung mit Topshelf (Version 3.1.107.0) erstellt. Die Anwendung funktioniert als Konsolenanwendung, aber ich kann nicht herausfinden, wie sie als Dienst installiert wird. Ich habe das Projekt in Visual Studio (Erstellen, Veröffentlichen) veröffentlicht, eine Eingabeaufforderung als Administrator gestartet, zu dem Ordner navigiert, in dem die Anwendung veröffentlicht wurde, und setup.exe -install an der Eingabeaufforderung ausgeführt. Die Anwendung wird installiert und ausgeführt, jedoch als Konsolenanwendung und nicht als Windows-Dienst. Was fehlt mir hier?

Für diejenigen, die mit Topshelf möglicherweise nicht vertraut sind, ist es ein Windows-Dienstframework für .Net und soll das oben beschriebene Szenario vereinfachen - Entwickeln und Debuggen als Konsolenanwendung, Bereitstellen als Windows-Dienst. Weitere Informationen finden Sie in der Dokumentation unter http://docs.topshelf-project.com/de/latest/index.html .

Brendan Reynolds
quelle
8
Ich habe mir die Frage "Windows-Dienst aus ausführbarer Datei erstellen" angesehen. Es scheint für meine Frage nicht relevant zu sein, da es sich nicht um Topshelf handelt.
Brendan Reynolds
2
Ja, genau das macht Topshelf, und ja, ich habe ihre Dokumentation recherchiert.
Brendan Reynolds
Was hast du gefunden? Anscheinend haben Sie anscheinend Probleme, die Dokumentation zu befolgen, insbesondere unter "Die Anwendung ist installiert und wird ausgeführt, aber als Konsolenanwendung, nicht als Windows-Dienst" . Wird der Dienst im MMC-Snap-In "Dienste" von Windows installiert?
CodeCaster
2
Soweit ich aus der Dokumentation ( docs.topshelf-project.com/en/latest/index.html ) ersehen kann, mache ich das, was ich tun soll. Aber da es für mich nicht funktioniert - aber nach meinen Suchanfragen für andere zu arbeiten scheint - übersehen ich vermutlich etwas. Und nein, die Anwendung wird nicht im Windows Services MMC-Snap-In angezeigt.
Brendan Reynolds

Antworten:

85

Führen Sie Ihre aus service.exe install, um den Dienst zu installieren.

Siehe die Topshelf Befehlszeilen - Referenzdokumentation für weitere Informationen.

Travis
quelle
1
Vielen Dank! Mein Fehler war, dass ich versucht habe, die Datei setup.exe zu installieren, die beim Veröffentlichen der Anwendung erstellt wurde, als ich die Datei servicename.exe im Ordner bin \ release hätte installieren sollen! Doh! Alle arbeiten jetzt.
Brendan Reynolds
Dies tut nichts ohne irgendeine Art von Code im Programm selbst, um die Installation durchzuführen.
Computercarguy
@Travis können Sie meine letzte Frage überprüfen Ich habe Probleme mit der Installation von Topshelf. Vielen Dank Kumpel
Roxy'Pro
34
  1. Starten Sie Visual Studio und erstellen Sie eine neue C # -Konsolenanwendung
  2. Klicken Sie mit der rechten Maustaste auf Referenzen und gehen Sie zur Verwaltung von NuGet-Paketen
  3. Laden Sie Topshelf über NuGet herunter und installieren Sie es
  4. Fügen Sie den folgenden Code in Ihre Anwendung ein und schließen Sie alle Importe ein.
  5. Wechseln Sie vom "Debug" -Modus zu "Release" und erstellen Sie die Anwendung.
  6. cmd.exeAls Administrator ausführen
  7. Navigieren Sie in der Konsole zu

    .\myConsoleApplication\bin\Release\
    
  8. Führen Sie den Befehl aus

    .\myConsoleApplication.exe install
    
  9. Führen Sie den Befehl aus

    .\myConsoleApplication.exe start
    

Code:

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

            });                                                 
        }
    }
}
Jonas_Hess
quelle
Kann ich den Dienst nach der Installation automatisch automatisch starten?
Mrid
7

Navigieren Sie zum Ordner und führen Sie den folgenden Befehl aus:

AppName.exe install

Sie müssen Ihre Eingabeaufforderung als Administrator ausführen.

Sonniger Okoro Awa
quelle
Dies tut nichts ohne irgendeine Art von Code im Programm selbst, um die Installation durchzuführen.
Computercarguy
3

Das ist also eine alte Frage, aber ich möchte einige Befehlszeilenoptionen hinzufügen.

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

.

--Auto-Start

ist für den Neustart von Windows.

Start

dient zum SOFORTIGEN Starten des Dienstes nach der Installation

Nun können die "Namen" auch im Code angegeben werden

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

Wenn die EXE-Datei als Konsolen-App (oder als Windows-Dienst) ausgeführt wird, kann dies eine Kombination aus dem Festlegen dieser Werte im Code und / oder der Übergabe über die Befehlszeile sein.

Ich würde erwarten, wenn Sie die "Namen" nicht im Code festgelegt haben UND Sie die "Namen" nicht über Befehlszeilenargumente übergeben haben, erhalten Sie ein Konsolenverhalten.

granadaCoder
quelle