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 .
quelle
Antworten:
Führen Sie Ihre aus
service.exe install
, um den Dienst zu installieren.Siehe die Topshelf Befehlszeilen - Referenzdokumentation für weitere Informationen.
quelle
cmd.exe
Als Administrator ausführenNavigieren Sie in der Konsole zu
.\myConsoleApplication\bin\Release\
Führen Sie den Befehl aus
.\myConsoleApplication.exe install
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"); }); } } }
quelle
Navigieren Sie zum Ordner und führen Sie den folgenden Befehl aus:
AppName.exe install
Sie müssen Ihre Eingabeaufforderung als Administrator ausführen.
quelle
Das ist also eine alte Frage, aber ich möchte einige Befehlszeilenoptionen hinzufügen.
.
ist für den Neustart von Windows.
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.
quelle