C# Ausführen von Windows-Form-Anwendung aus dem Dienst (und in Vista)
Ich Schreibe eine Applikation in C# und muss als Dienst ausgeführt werden, sondern auch von Benutzer-Interaktion. Ich verstehe, dass Dienste haben keine Benutzeroberfläche, etc, also habe ich aufgeteilt, mein Programm in eine windows form-Anwendung und einem service, der kann mit jedem anderen kommunizieren.
Das problem das ich habe ist, dass ich den Dienst benötigen, um sicherzustellen, dass die windows-form-Anwendung der immer ausgeführt wird, und starten Sie es neu, wenn es nicht ist. Ich bin in der Lage zu erkennen, wenn es ausgeführt wird, und starten Sie es mit dem folgenden code auf Windows 2000/XP:
System.Diagnostics.Process.Start("ExePath");
aber auf Vista, es läuft der neue Prozess als ein System-Prozess ist für den Benutzer unsichtbar. Hat jemand die Möglichkeit, um dieses? Gibt es eine Möglichkeit zu erkennen, welche Benutzer derzeit angemeldet ist, und führen Sie den neuen Prozess, so dass Benutzer? Ich brauche nicht zu berücksichtigen, für die schnelle Benutzerumschaltung an dieser Stelle. Etwas - etwas - basic genügen würde.
Ich wäre dankbar für jede Hilfe oder Tipps, die Sie haben auf das Thema.
Muss ich klarstellen, dass ich die Einstellung "Allow service to interact with desktop" - option, wenn der Dienst installiert ist. Dies ist, was ermöglicht es die Arbeit, die auf 2000/XP. Aber Vista hat immer noch den oben genannten problem.
- Bin ich etwas fehlt? Wenn Sie einen Dienst, der immer läuft... warum ist es wichtig, wenn Ihr windows form-Anwendung ausgeführt wird?
- Denn ich brauche eine Möglichkeit für den service zur Kommunikation mit dem Benutzer direkt. Es gibt eine Menge Gründe, aber die meisten basic-Beispiel ist für die Aktualisierung dar.
- Ich bin mit den anderen hier... ich vermute, dass Sie dabei sind der falsche Ansatz, zu welchem problem Sie zu lösen versuchen. Wenn Sie eine UI-dann haben Sie wahrscheinlich shouldn ' T be using a service-Modell. Vielleicht etwas, das sich in den system-tray...?
- Meine form-Anwendung tatsächlich befinden sich in der system tray. Ich bin offen für Ideen, wenn ich unter der falsche Ansatz. Bisher wurde ich noch nicht überzeugt von, dass. Ich brauche den Dienst, um in der Lage sein, direkt zu kommunizieren mit dem Benutzer, wenn bestimmte Ereignisse passieren. Gibt es einen besseren Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die generelle Idee für diese Art der Sache ist, wenn der Benutzer benötigt, um die Interaktion mit einem service, sollten Sie starten Sie eine separate Anwendung. Wenn Sie wollen, um Ihnen zu helfen, können Sie konfigurieren, dass die separate Anwendung, die mit windows zu starten, indem eine Verknüpfung im start-up-Menü. Sie können auch bauen crash-recovery in Ihre Anwendung, so kann es automatisch neu gestartet.
Sollten Sie sich nicht wirklich verlassen sich auf die überwachung der forms-Anwendung, was, wenn niemand angemeldet ist? Was ist, wenn mehrere Personen angemeldet sind? Es wird nur chaotisch, Dinge zu tun auf diese Weise.
Dass der service einfach nur da sitzen und broadcast-Hörer ist der Weg zu gehen. Wenn der forms-Anwendung gestartet werden kann, Benachrichtigen Sie den service es hören will-Veranstaltungen.
Finden Sie unter der Frage: Wie kann ein Windows-Dienst ausführen einer GUI-Anwendung?. Es richtet sich an die gleiche Frage, die von C/C++ (kurze Antwort: CreateProcessAsUser), aber die Antwort ist immer noch gültig (mit P/Invoke) für C#.
In diesem Fall müssen Sie, um einen Dritten monitor Prozess, die erkennt, wenn das Programm nicht und starten Sie es in diesem Fall.
Jedoch, Sie am Ende mit ein unlösbares problem ist hier, wie an den monitor-Prozess muss beobachtet werden, um sicherzustellen, dass es nicht heruntergefahren werden, und so weiter, und so weiter, und so weiter.
Möchten Sie vielleicht zu überdenken, dieser Ansatz.
Seine eine schwierige situation. Wie bereits erwähnt, in ein paar Orte, wenn Sie muss haben ein UI dann technisch sollte man sich nicht mit einem service. Afterall, Dienste laufen, ohne dass der Benutzer noch angemeldet. Wenn niemand angemeldet ist, können Sie nicht über eine Benutzeroberfläche.
Normalerweise, wenn ich einen Dienst benötigen, muss die Kommunikation mit der Außenwelt, es gibt zwei Dinge, die ich für entscheiden. Ich kann entweder ein Eintrag in das Ereignisprotokoll, oder kann ich das ablegen einer Nachricht in einer Warteschlange.
In deinem Fall würde ich die Verwendung einer Warteschlange. Wenn sich ein Benutzer anmeldet, können Sie die auto-start eine app für Sie, überwacht die Warteschlange. Wenn die app ausgeführt wird, wenn die Nachricht empfangen wird, werden Sie gewarnt, dass der Weg als gut. Jedoch, wenn der Benutzer schließt die app dann das gleiche passiert... Sie wird nicht wissen.
Erste, schnelle Antwort: Hat das "Allow service to interact with desktop" - option (service -> Eigenschaften -> Anmeldung) oder ein Konto angeben lassen, was Sie wollen? Wenn ja, beides kann konfiguriert werden, auf Ihre service-installer-Klasse.
Wie die anderen, ich vermute, es ist ein besserer Ansatz, um diese und entweder eine der folgenden Bedingungen erfüllt ist:
-Der code, der in den Dienst aufgenommen werden könnten in die winforms-app (vielleicht läuft in einem hintergrund-thread), und Hinzugefügt, um windows startup. Beide laufen wird
-Winforms-app kann einfach nur Zuhören, um den Dienst, wenn es eingeschaltet ist, und muss nicht gestartet werden, aus dem Dienst. Oder ähnlich, der die app Hinzugefügt werden könnten, zu starten.
Ihre service-führen Sie die Anwendung wie ein Benutzer (das scheint das zu sein, was Sie versuchen zu tun), müssen Sie Folgendes tun:
Wo:
Auch, um für Ihren Dienst die Berechtigung haben, um eine Anwendung zu starten, muss es als ein service ausgeführt werden auch. Um dies zu tun, müssen Sie diese Zeilen in Ihre service-installer-Klasse:
In Windows 2000 und XP gibt es eine option (checkbox) auf der Registerkarte Anmeldung des service-Eigenschaften-Fenster zu ermöglichen, den Dienst mit dem desktop interagieren. Ich glaube, das ist das, was Sie suchen. Ich schrieb einen schnellen service in VB.NET mit einem Prozess.Start("calc.exe") und Windows-Rechner geöffnet, einfach nur gut.
Bin ich mir nicht 100% sicher, dass dieses funktioniert auf die gleiche Art und Weise, in Vista aber.
Klingt wie Sie vielleicht nicht brauchen, die Hälfte davon als Dienst ausgeführt wird (es sei denn, es ist eine Anforderung von höheren rechten), als Ihren Dienst zu verkraften müssen, wenn kein interaktiver Benutzer angemeldet ist, als gut.