Ich habe einen Windows-Dienst in C # geschrieben, der als Proxy für eine Reihe von Netzwerkgeräten für die Backend-Datenbank fungiert. Zum Testen und auch zum Hinzufügen einer Simulationsebene zum Testen des Backends würde ich gerne eine GUI haben, auf der der Testoperator die Simulation ausführen kann. Auch für eine Striped-Down-Version als Demo versenden. Die GUI und der Dienst müssen nicht gleichzeitig ausgeführt werden. Was ist der beste Weg, um diesen Duell-Vorgang zu erreichen?
Bearbeiten: Hier ist meine Lösung, die Sachen von dieser Frage kämmt, Bin ich als Dienst ausgeführt und Installieren Sie einen .NET-Windows-Dienst ohne InstallUtil.exe mit diesen ausgezeichneten Code von Marc Gravell
Es wird die folgende Zeile verwendet, um zu testen, ob gui ausgeführt oder als Dienst ausgeführt werden soll.
%Vor%Hier ist der Code.
%Vor%Sie haben grundsätzlich zwei Möglichkeiten. Stellen Sie entweder eine API für den Dienst bereit, die Sie dann über die UI-App aufrufen können ODER aktivieren Sie den Dienst entweder als winforms-App oder als Dienst.
Die erste Option ist ziemlich einfach - verwenden Sie Remoting oder WCF, um die API verfügbar zu machen.
Die zweite Option erreichen Sie, indem Sie die "Eingeweide" Ihrer App in eine separate Klasse verschieben und dann einen Service-Wrapper und einen Win-Forms-Wrapper erstellen, die beide in Ihre Klasse "guts" aufrufen.
%Vor%Erstellen Sie eine neue winforms-App, die auf die Assemblierung Ihres Dienstes verweist.
Wenn Sie den folgenden Code verwenden:
%Vor%Dann wird Ihre EXE entweder als Dienst ausgeführt (falls vom SCM gestartet) oder als GUI (falls von einem anderen Prozess gestartet).
Im Wesentlichen wird alles, was ich hier gemacht habe, Reflektor verwendet, um herauszufinden, was das Fleisch von ServiceBase.Run
tut dies und dupliziert es hier (Reflektion ist erforderlich, da es private Methoden aufruft). Der Grund dafür, dass ServiceBase.Run
nicht direkt aufgerufen wird, ist, dass es ein Meldungsfeld öffnet, um dem Benutzer mitzuteilen, dass der Dienst nicht gestartet werden kann (falls nicht vom SCM gestartet) und nichts zurückgibt der code , dass der Dienst nicht gestartet werden kann.
Da dies die Reflektion zum Aufrufen privater Framework-Methoden verwendet, funktioniert es möglicherweise in zukünftigen Versionen des Frameworks nicht ordnungsgemäß. Caveat Codor.
Es gibt auch FireDaemon . Dadurch können Sie jede Windows-Anwendung als Dienst ausführen.
Siehe Leite ich als Dienst für weitere nützliche Zwecke Informationen.
Am wichtigsten ist, wie zuverlässig festgestellt werden kann, ob wir interaktiv oder über einen Dienst arbeiten.
Eine andere Möglichkeit besteht darin, NICHT einen Dienst zu benutzen, sondern eine Anwendung zu verwenden, die sich in der Taskbar befindet (denke Roxio Drag-to-Disc, und höchstwahrscheinlich lebt Ihre Antiviren-Software dort unten), die ein Icon unten hat die Uhr, die ein Menü startet, wenn mit der rechten Maustaste geklickt wird, und eine Benutzeroberfläche, auf die Sie doppelklicken.
Wenn Ihr Dienst richtig moduliert ist, können Sie den Dienst entweder in einer ausführbaren Datei als Dienst oder mit einer ausführbaren Datei mit gui für den Test hosten. Wir verwenden diese Methode auch für unseren Dienst, die eigenständige ausführbare Datei hostet den Dienst in einer produktiven Umgebung, aber wir haben auch eine Konsolen-App, um den Dienst zu hosten.
Trennen Sie Ihren Code in verschiedene Komponenten: eine Komponente zum Verwalten der Serviceaspekte und eine zum Ausführen der eigentlichen Geschäftslogik. Erstellen und interagieren Sie mit der Geschäftslogik von der Servicekomponente. Zum Testen (Ihrer Geschäftslogik) können Sie eine WinForm- oder Konsolenanwendung erstellen, die die Geschäftslogikkomponente ohne die Servicekomponente verwendet. Besser noch, verwenden Sie einen Unit-Test-Framework für den Großteil Ihrer Tests. Viele der Methoden in der Servicekomponente werden zweifellos auch Unit-Testable sein.
Wenn Sie Ihre Geschäftslogik in Serviceklassen kapseln und anschließend ein Factory-Muster zum Erstellen dieser Services verwenden, können Sie dieselben Services für eine Desktopanwendung (Desktop Factory) und als Webdienste (Host in WCF) verwenden.
Service-Definition:
%Vor%Factory für Desktop-WinForms, um an Services zu kommen, um Geschäfte zu machen:
%Vor%Sie hosten dies entweder mit der WCF-ServiceHost-Klasse oder in IIS. Beide ermöglichen es Ihnen, anzugeben, wie jede Instanz des Dienstes instanziiert werden soll, damit Sie Initialisierungen wie Verbindungszeichenfolgen usw. durchführen können.
Sie können den Service erstellen, um eine andere ausführbare Datei mit einem Befehlszeilenargument aufzurufen, sodass sie ohne das Formular ausgeführt wird. Wenn diese exe ohne das Befehlszeilenargument aufgerufen wird, zeigt sie das Formular an und verhält sich wie normal.
Tags und Links c# windows-services winforms service installer