Kommunikation Windows-Dienst↔Windows-Form

Hallo,

ich weiß nicht mehr weiter:

Nachdem ich jetzt zu meinem Programm (siehe „Prozessname zu einer .exe-Datei herausfinden“ weiter unten im Brett) jetzt endlich den Dienst soweit fertiggestellt habe, tun sich mir schon wieder 2 schwerwiegende Probleme auf. Und zwar:

1: Ich habe, um den Dienst seine Aufgaben zuzuweisen und ein paar Stati abzufragen, eine GUI entwickelt (Windows-Form, in der selben Projektmappe und dem selben Namespace), die mithilfe von Events, die der Dienst abonniert hat, mit dem Dienst kommunizieren soll.

Zum Beispiel: Der Benutzer drückt einen Knopf, damit der Dienst sofort prüft, ob das angegebene Programm noch läuft und es ggf. neu startet.

Umsetzung in einer Unterklasse der GUI:

public delegate void CheckNow(object sender, EventArgs e);
public static event CheckNow OnCheckNow;

internal static void RaiseCheckNowEvent()
{
if (OnCheckNow != null)
OnCheckNow(GUI.ActiveForm, new EventArgs());
}

Umsetzung im Service:

GUIEvents.OnCheckNow += new GUIEvents.CheckNow(CheckProcess);

Theoretisch sollte also durch Knopfdruck >>RaiseCheckNowEvent() ausgeführt werden, und der Service sollte darauf reagieren, indem er >>CheckProcess ausführt.

Nur klappt dies leider gar nicht, der Service reagiert auf nichts.
Das einzige, was meine GUI bis jetzt kann, ist also, den Dienst zu installieren und zu starten.

2: Um das Problem zu lösen, möchte ich den Dienst gerne debuggen und habe mir dazu schon alle möglichen Anleitungen im Microsoft-msdn durchgelesen, aber es klappt bei mir einfach nicht.

Nachdem ich den Visual Studio-Debugger an den Service angehangen habe, werden nur alle Haltepunkte im Code als nicht erreichbar angezeigt und Informationen, welche Zeilen überhaupt abgearbeitet werden, erhalte ich auch nicht.

Kann mir dabei jemand helfen?

Dankend im Vorraus und mit freundlichen Grüßen,
Bluesky787

Hi,
du musst den Dienst über die Buildereignisse stoppen, deinstallieren, installieren und starten.

Sollte ungefähr so aussehen:
Präbuild:

stop 
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" /u $(TargetPath)

Postbuild:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" $(TargetPath)
start 

Dazu brauchst du Adminrechte, d.h. VS als Admin starten :wink:

Lg Knerd

Hallo!

Ich weiß nicht so recht, ob ich die Situation richtig verstanden habe.
Du hast einen Dienst (von ServiceBase abgeleitet), der auch bereits installiert ist und läuft, ja? Sprich: Er taucht in der Diensteverwaltung auf und lässt sich u.a. darüber starten und beenden?

Und dann möchstest Du ein weiteres Programm (WinForms/WPF?) haben, das mit dem Dienst kommuniziert, ja?

Der Dienst selbst kann in aller Regel ja keine Oberfläche anzeigen, weil keine Interaktion mit dem Desktop zugelassen ist und der Dienst ja auch läuft, wenn gerade kein Benutzer angemeldet ist.

Also muss die Steuerung in ein separates Programm ausgelagert werden, das mit dem Dienst kommuniziert. Üblicherweise macht man das über WCF.
Vorgehen ist folgendes: Du definierst Dir ein Interface mit den benötigten Funktionen und der Dienst veröffentlicht einen WCF Service, der genau diese Funktionen bereitstellt.
Das gleiche Interface referenzierst Du aus Deiner Steueranwendung, stellst beim Start die Verbindung zum WCF-Service her und kannst dann Interfacemethoden aufrufen, die nicht in Deinem eigenen, sondern im Prozessraum des Dienstes ausgeführt werden.

Ein kleines Beispiel findest Du z.B. hier: http://msdn.microsoft.com/en-us/library/ms733069.aspx

Gruß,
Martin

Hallo,

danke erstmal für die Antwort.
Ich denke, du hast die Situation ziemlich gut verstanden und der Dienst ist eingetragen, startet und läuft - er scheint nur nichts zu tun.

Ist es denn überhaupt nicht möglich, dass der Dienst, einfach weil er im selben Namespace geschrieben wurde, mit meinem Programm über die registrierten Events kommuniziert?

Die Variante, die du mir aufgezeigt hast, klingt zwar super, bedeutet aber, dass ich so ziemlich wieder von vorne anfangen muss…

Mit freundlichen Grüßen,
Bluesky787

P.S.: Programmierung mit Diensten ist völliges Neuland für mich, also entschuldige bitte eventuelle DAU-Fragen.

Hallo nochmal!

Das mit dem gleichen Namespace hat gar nichts zu bedeuten.
Du kannst ja ein Programm i.d.R. auch zweimal starten, dann läuft sogar der identische Code in beiden Instanzen, aber irgendwelche Events, die in der einen Instanz ausgelöst werden, finden dennoch nicht auf magische Weise ihren Weg in die andere Instanz.

Du hast einfach 2 unterschiedliche Prozesse und wenn die mit einander kommunizieren wollen, muss eine Form von IPC eingesetzt werden - Punkt.

WCF macht es Dir ja sehr leicht, so etwas zu realisieren, daher sollte sich der Aufwand in Grenzen halten.

Gruß,
Martin

Und auch danke nochmal!

Ich habe in meinem schlauen C#-Buch was von Anwendungsdomänen gelesen und da wo was durcheinander gebracht.

Ich danke dir für die Erleuchtung :smile:

Muss ich mein Projekt wohl nochmal überarbeiten…

Mit freundlichen Grüßen,
Bluesky787