Wie schreibe ich einen c # -Dienst, den ich auch als winforms-Programm ausführen kann?

7

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%     
Rex Logan 07.01.2009, 18:44
quelle

11 Antworten

17

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%     
bozag 07.01.2009, 19:02
quelle
2

Erstellen Sie eine neue winforms-App, die auf die Assemblierung Ihres Dienstes verweist.

    
Abtin Forouzandeh 07.01.2009 18:46
quelle
2

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.

    
P Daddy 07.01.2009 19:15
quelle
1

Es gibt auch FireDaemon . Dadurch können Sie jede Windows-Anwendung als Dienst ausführen.

    
Ray Booysen 07.01.2009 18:48
quelle
1

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.

    
Ash 08.01.2009 18:28
quelle
0

Sie müssen einen separaten Prozess implementieren, der mit Ihrem Service kommunizieren kann. Während es auf XP und früheren Systemen möglich ist, einen Dienst mit einer Benutzeroberfläche zu haben, ist das unter Vista und später nicht mehr möglich.

    
Stefan 07.01.2009 18:48
quelle
0

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.

    
Stephen Wrighton 07.01.2009 18:50
quelle
0

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.

    
Oliver Friedrich 07.01.2009 18:51
quelle
0

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.

    
tvanfosson 07.01.2009 18:56
quelle
0

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.

    
Jason Jackson 07.01.2009 21:52
quelle
0

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.

    
quelle