Wie man mit einem Windows-Dienst von einer Anwendung kommunizieren, die mit dem Desktop interagiert?

StackOverflow https://stackoverflow.com/questions/84860

Frage

Mit .Net, was der beste Weg ist, mit einem Service (das heißt, wie die meisten tun tablett Apps kommunizieren mit ihren Servern) zu interagieren. Es wäre vorzuziehen, wenn diese Methode als auch Cross-Plattform sein würde (Arbeits in Mono, also denke ich, ist Remoting out?)


Edit:

vergessen zu erwähnen, wir haben immer noch Windows 2000 Maschinen im Feld zu unterstützen, so WCF und alles, was über .Net 2.0 werden nicht fliegen.

War es hilfreich?

Lösung

Beachten Sie, dass, wenn Sie planen, auf dem Windows Vista oder Windows Server 2008, viele Möglichkeiten, um schließlich bereitstellen, die dies heute getan werden kann, wird nicht funktionieren. Dies ist wegen der Einführung einer neuen Sicherheitsfunktion „Session 0 Isolation“ bezeichnet.

Die meisten Windows-Dienste wurden in Sitzung 0 jetzt bewegt, um laufen sie vom Rest des Systems, um richtig zu isolieren. Eine Erweiterung davon ist, dass der erste Benutzer auf das System nicht mehr in Session # platziert anmelden 0, werden sie in 1. Session platziert und daher wird die Isolation Code brechen, die zwischen Diensten und Desktop-Anwendungen bestimmte Arten von Kommunikation funktioniert.

Der beste Weg, um Code zu schreiben heute, dass auf Vista funktionieren wird und Server 2008 geht nach vorn, wenn die Kommunikation zwischen den Diensten und Anwendungen zu tun ist, eine richtige Quer Prozess API wie RPC zu verwenden, Named Pipes usw. Sie Sendmessage / Postmessage nicht verwenden wie das wird unter Session 0 Isolation versagen.

http://www.microsoft.com/whdc/system/vista/ services.mspx

Jetzt, da Ihre Anforderungen, Sie gehen in ein wenig eine Gurke sein. Für die plattformübergreifende Anliegen, ich bin nicht sicher, ob würde Remoting unterstützt werden. Sie können bis fallen haben und gehen den ganzen Weg zurück an die Buchsen: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

Andere Tipps

Wenn dies ein Tablett App ist, und kein echter Service, vorsichtig sein, wie Sie Ihre Kommunikation einrichten, wenn Leitungen oder TCP / IP. Wenn mehrere Benutzer in einen Rechner angemeldet sind (Citrix, Remote Desktop) und jeder Benutzer startet ein Tablett App „Service“, dann können Sie in eine Situation kommen, wo Sie mehrere Prozesse versuchen, das gleich bekannt Port oder ein Rohr zu verwenden. Natürlich ist dies kein Problem, wenn Sie nicht mehr Leitungen auf der Unterstützung oder wenn Sie einen echten Service planen müssen als auf ein Tablett App Gegensatz, die in jedem Benutzer-Shell ausgeführt wird.

Haben Sie da hört auf einem vordefinierten Port mit einem einfachen alten TCP Stream-Socket auf 127.0.0.1. Schließen Sie an diesen Port von Ihrem Desktop-Anwendung.

Es ist einfach tot und es ist völlig Cross-Plattform.

Hat einer von euch tatsächlich versuchen, mit Mono Remoting? Es funktioniert ganz gut. Sie könnten in einigen Fällen Ecke stoßen, aber das ist sehr unwahrscheinlich. Testen Sie einfach Ihre Anwendung für Cross-Plattform (MS.Net <-> Mono) Remoting von Zeit zu Zeit alle möglichen Pannen zu fangen. Und beginnt mit einer aktuellen Mono, 2.4.2 aktuell ist.

Remoting ist eine Option, aber es ist nicht plattformübergreifend. Einige andere Möglichkeiten gibt, Named Pipes zu verwenden, IPC, oder Kernel-Ereignisse.

Komischerweise würde ich vorschlagen Remoting! Die Mono 1.0 Release Notes (von archive.org, weil die ursprüngliche Position fehlt) erwähnen System.Runtime.Remoting.dll als unterstützte Bibliothek und sagt nichts über bekannte Probleme.

Wenn Remoting ist aus dann müssen Sie wahrscheinlich Ihr eigenes TCP-Nachricht Framing-Protokoll implementieren. Windows nicht ein Äquivalent auf der gleichen Maschine für die Kommunikation UNIX-Domain-Sockets haben.

Die meisten Dienste, die eine GUI-Komponente aufweisen, werden als benannte Benutzer ausgeführt werden, und der Zugriff auf den Desktop erlaubt. Auf diese Weise können Sie es über COM zugreifen oder .NET aber nur lokal (es sei denn, Sie kompliziert erhalten möchten)

Ich persönlich öffne eine gewöhnliche alte Buchse auf dem Service - seine Cross-Plattform, mehrere Clients ermöglicht, erlaubt jede App für den Zugriff, beruht nicht auf Windows-Sicherheit für sie geöffnet wird und ermöglicht Ihre GUI zu sein geschrieben Sie in jeder Sprache mag (wie alles unterstützt Sockets).

Für ein Tablett App, dann würden Sie ein simle Protokoll kommunizieren wollen -. Sie könnte genauso gut eine REST-Stil-System verwenden, um Befehle an sie zu senden, und streamen XML (igitt) oder einen benutzerdefinierten Datenformat zurück

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top