Ich habe eine Konsolenanwendung und möchte sie als Windows-Dienst ausführen. VS2010 verfügt über eine Projektvorlage, mit der Konsolenprojekte angehängt und Windows-Dienste erstellt werden können. Ich möchte kein separates Dienstprojekt hinzufügen und wenn möglich Dienstcode in die Konsolenanwendung integrieren, um die Konsolenanwendung als ein Projekt beizubehalten, das als Konsolenanwendung oder als Windows-Dienst ausgeführt werden kann, wenn es beispielsweise über die Befehlszeile mit Switches ausgeführt wird.
Vielleicht könnte jemand eine Klassenbibliothek oder ein Code-Snippet vorschlagen, mit dem die c # -Konsolenanwendung schnell und einfach in einen Dienst umgewandelt werden kann?
Antworten:
Normalerweise verwende ich die folgende Technik, um dieselbe App als Konsolenanwendung oder als Dienst auszuführen:
Environment.UserInteractive
ist normalerweise wahr für die Konsolen-App und falsch für einen Dienst. Technisch gesehen ist es möglich, einen Dienst im benutzerinteraktiven Modus auszuführen, sodass Sie stattdessen einen Befehlszeilenschalter überprüfen können.quelle
Ich habe mit TopShelf großen Erfolg gehabt .
TopShelf ist ein Nuget-Paket, mit dem Sie auf einfache Weise .NET Windows-Apps erstellen können, die als Konsolen-Apps oder als Windows-Dienste ausgeführt werden können. Sie können Ereignisse wie Start- und Stoppereignisse Ihres Dienstes schnell verknüpfen, mithilfe von Code konfigurieren, z. B. um das Konto festzulegen, unter dem es ausgeführt wird, Abhängigkeiten von anderen Diensten konfigurieren und die Wiederherstellung nach Fehlern konfigurieren.
Über die Package Manager-Konsole (Nuget):
Lesen Sie die Codebeispiele, um loszulegen.
Beispiel:
TopShelf kümmert sich auch um die Service-Installation, was viel Zeit spart und Boilerplate-Code aus Ihrer Lösung entfernt. Um Ihre .exe als Dienst zu installieren, führen Sie einfach Folgendes an der Eingabeaufforderung aus:
Sie müssen keinen ServiceInstaller anschließen und das alles - TopShelf erledigt alles für Sie.
quelle
Hier ist die vollständige Anleitung:
* InstallUtil.exe finden Sie normalerweise hier: C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.ex e
Program.cs
MyService.cs
MyServiceInstaller.cs
quelle
Ich höre Ihren Standpunkt, dass eine Assembly wiederholten Code stoppen soll, aber es wäre am einfachsten und würde die Code-Wiederholung reduzieren und es einfacher machen, Ihren Code in Zukunft auf andere Weise wiederzuverwenden, wenn Sie ihn in drei Assemblys aufteilen würden.
quelle
Start()
undStop()
Methoden und die Konsolen-App hat eine Schleife. Ohne ein Framework wie TopShelf zu verwenden , ist dies die beste OptionHier finden Sie eine neuere Methode zum Verwandeln einer Konsolenanwendung in einen Windows-Dienst als Worker-Dienst basierend auf dem neuesten .NET Core 3.1 .
Wenn Sie einen Worker-Dienst aus Visual Studio 2019 erstellen, erhalten Sie fast alles, was Sie zum sofortigen Erstellen eines Windows-Dienstes benötigen. Dies müssen Sie auch in die Konsolenanwendung ändern, um ihn in einen Windows-Dienst zu konvertieren.
Hier sind die Änderungen, die Sie vornehmen müssen:
Installieren Sie die folgenden NuGet-Pakete
Ändern Sie Program.cs in eine Implementierung wie die folgende:
und fügen Sie Worker.cs hinzu, in das Sie den Code einfügen, der von den Servicevorgängen ausgeführt wird:
Wenn alles fertig ist und die Anwendung erfolgreich erstellt wurde, können Sie mit sc.exe Ihre Konsolenanwendung exe als Windows-Dienst mit dem folgenden Befehl installieren:
quelle
Sie können verwenden
Und es wird in der Serviceliste angezeigt. Ich weiß aber nicht, ob das richtig funktioniert. Ein Dienst muss normalerweise mehrere Ereignisse abhören.
Es gibt jedoch mehrere Service-Wrapper, mit denen jede Anwendung als echter Service ausgeführt werden kann. Zum Beispiel Microsoft SrvAny aus dem Win2003 Resource Kit
quelle
Zuerst binde ich die Konsolenanwendungslösung in die Windows-Servicelösung ein und verweise darauf.
Dann mache ich die Konsolenanwendung Program class öffentlich
Ich erstelle dann zwei Funktionen innerhalb der Konsolenanwendung
Dann instanziiere ich innerhalb des Windows-Dienstes selbst das Programm und rufe die Start- und Stoppfunktionen auf, die in OnStart und OnStop hinzugefügt wurden. Siehe unten
Dieser Ansatz kann auch für einen Windows-Anwendungs- / Windows-Dienst-Hybrid verwendet werden
quelle
Vielleicht sollten Sie definieren, was Sie benötigen. Soweit ich weiß, können Sie Ihre App nicht gleichzeitig als Konsole oder Dienst mit Befehlszeile ausführen. Denken Sie daran, dass der Dienst installiert ist und Sie ihn im Services Manager starten müssen. Sie können eine neue Anwendung erstellen, die den Dienst startet oder einen neuen Prozess zum Ausführen Ihrer Konsolen-App startet. Aber wie du geschrieben hast
Einmal war ich in Ihrer Position und habe aus einer Konsolenanwendung einen Dienst gemacht. Zuerst benötigen Sie die Vorlage, falls Sie mit VS Express Edition arbeiten. Hier ist ein Link, über den Sie Ihre ersten Schritte ausführen können: C # Windows-Dienst , das war sehr hilfreich für mich. Fügen Sie dann mithilfe dieser Vorlage Ihren Code zu den gewünschten Ereignissen des Dienstes hinzu.
Um Ihren Service zu verbessern, können Sie noch etwas anderes tun. Dies ist jedoch nicht schnell und / oder einfach. Sie verwenden Appdomains und erstellen DLLs zum Laden / Entladen. In einer können Sie einen neuen Prozess mit der Konsolen-App starten, und in einer anderen DLL können Sie einfach die Funktionen festlegen, die der Dienst ausführen muss.
Viel Glück.
quelle
Sie müssen die Funktionalität in eine Klasse oder Klassen aufteilen und diese über einen von zwei Stubs starten. Der Konsolen- oder Service-Stub.
Wie zu sehen ist, präsentieren die unzähligen Dienste, aus denen die Infrastruktur besteht, beim Ausführen von Fenstern dem Benutzer keine Konsolenfenster (und können diese auch nicht direkt). Der Dienst muss nicht grafisch mit dem Benutzer kommunizieren: über das SCM; im Ereignisprotokoll, in einer Protokolldatei usw. Der Dienst muss auch über das SCM mit Windows kommunizieren, sonst wird er heruntergefahren.
Es wäre natürlich akzeptabel, eine Konsolen-App zu haben, die mit dem Dienst kommunizieren kann, aber der Dienst muss unabhängig ausgeführt werden, ohne dass eine GUI-Interaktion erforderlich ist.
Der Console-Stub kann sehr nützlich für das Debuggen des Dienstverhaltens sein, sollte jedoch nicht in einer "produzierten" Umgebung verwendet werden, die schließlich zum Erstellen eines Dienstes dient.
Ich habe es nicht vollständig gelesen, aber dieser Artikel scheint in die richtige Richtung zu weisen .
quelle
Ich verwende eine Serviceklasse, die dem von vorgeschriebenen Standardmuster folgt
ServiceBase
, und gehe auf Helfer ein, um das F5-Debugging zu vereinfachen. Auf diese Weise bleiben die Servicedaten innerhalb des Service definiert, sodass sie leicht zu finden und ihre Lebensdauer einfach zu verwalten sind.Normalerweise erstelle ich eine Windows-Anwendung mit der folgenden Struktur. Ich erstelle keine Konsolenanwendung. Auf diese Weise taucht nicht jedes Mal, wenn ich die App starte, eine große Black Box in meinem Gesicht auf. Ich bleibe im Debugger, wo die ganze Aktion ist. Ich benutze,
Debug.WriteLine
damit die Nachrichten in das Ausgabefenster gehen, das gut andockt und sichtbar bleibt, nachdem die App beendet wurde.Normalerweise füge ich keinen Debug-Code zum Stoppen hinzu. Ich benutze stattdessen nur den Debugger. Wenn ich das Stoppen debuggen muss, mache ich das Projekt zu einer Konsolen-App, füge eine
Stop
Weiterleitungsmethode hinzu und rufe sie nach einem Aufruf von aufConsole.ReadKey
.quelle