In einer Situation, in der Sie das UI-Frontend mit dem neuen Metro-Stil von Apps für Windows 8 erstellt haben und möchten, dass es mit einer .NET-Anwendung kommuniziert, die auf dem Desktop auf demselben lokalen Computer ausgeführt wird (z. B. einer Windows-Dienst-App).
Welche Formen der Interprozesskommunikation stehen zwischen der Metro-App und der Desktop-App zur Verfügung?
Vielen Dank an Pavel Minaev vom Visual Studio-Team, der hier in einem Kommentar erste Informationen zur Verfügung gestellt hat.
Laut Martyn Lovell gibt es dafür keinen absichtlichen Mechanismus, und einige, die dafür verwendet werden könnten, sind absichtlich eingeschränkt. Named Pipes sind beispielsweise nicht vorhanden, und es sind auch keine Speicherzuordnungsdateien vorhanden. Es gibt Sockets (einschließlich Server-Sockets), aber wenn Sie eine Verbindung zu localhost herstellen, können Sie nur eine Verbindung zu derselben App herstellen. Sie könnten normale Dateien in einem der freigegebenen "bekannten Ordner" (Dokumente, Bilder usw.) verwenden, aber das ist ein ziemlich grober Hack, der eine Abfrage erfordert und für den Benutzer sichtbar ist. - Pavel Minaev kommentiert dieses Problem
Wenn ich also an normalen Ansätzen scheiterte, dachte ich daran, Webdienste zu verwenden oder in eine Datenbank zu lesen / schreiben, um eine Form der Kommunikation zu erreichen. Beides scheint übertrieben, wenn die Prozesse auf demselben Computer ausgeführt werden.
Ist das, was ich hier versuche, sinnvoll? Ich sehe, dass eine Metro-App die Frontend-Benutzeroberfläche für einen vorhandenen Dienst sein muss, der auf dem Desktop ausgeführt wird. Oder ist es besser, WPF nur für die Frontend-Benutzeroberfläche zu verwenden, die auf dem Desktop ausgeführt wird (dh eine Nicht-Metro-App).
Antworten:
Ich portiere gerade mein bestehendes Projekt auf Win8. Es besteht aus Windows-Dienst und Tray-Anwendung, die über NamedPipes WCF miteinander kommunizieren. Wie Sie vielleicht bereits wissen, unterstützt Metro keine Named Pipes. Am Ende habe ich TcpBinding für eine Vollduplexverbindung verwendet.
Dieser Beitrag beschreibt, welche Funktionen unterstützt werden.
Probe meiner WCF - Server , dass Metro - Client verbrauchen kann , ist hier .
Beachten Sie auch, dass Sie in Metro kein synchrones WCF verwenden können. Sie müssen verwenden Aufgabe , die nur asynchron -basierte Wrapper.
Und danke für deine Frage. Ich war ein guter Ausgangspunkt für mich :)
quelle
Am Ende einer // Build / Session, an der ich teilgenommen habe, gab es eine Reihe solcher Fragen. Aleš Holeček, der Geschäftsführer, der eine der Big-Picture-Sessions durchgeführt hat, kam aus dem Publikum, um sich um sie zu kümmern. Auch wenn Sie kein C ++ - Entwickler sind, laden Sie diese Sitzung herunter und sehen Sie sich die Fragen und Antworten an. http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C
Metro-Apps können nicht damit rechnen, dass Desktop-Apps oder -Dienste auf dem Computer installiert werden. Und Desktop-Apps können nicht mit der Ausführung von Metro-Apps rechnen, da sie jederzeit angehalten werden können. Sie müssen anfangen, anders zu denken. Hören Sie sich Aleš an.
quelle
localhost
direkte Verbindung über einen TCP-Socket herstellen können, warum können Sie dies dann auch über WCF tun?Beachten Sie, dass mit Windows 8.1 Update die Kommunikation zwischen Windows Store-Apps und Desktop-Komponenten, die in C # für .NET 4.5+ geschrieben wurden, jetzt offiziell für seitlich geladene Anwendungen in Unternehmensszenarien unterstützt wird:
Brokered Windows Runtime Components für seitlich geladene Windows Store-Apps
Zitieren:
Obwohl die Implementierung dieses Ansatzes anfangs etwas kompliziert ist, ermöglicht sie eine umfassende Integration zwischen Windows Store- und Desktop-Komponenten. Beachten Sie jedoch, dass die öffentliche Windows Store-Zertifizierung vorerst nicht bestanden wird.
quelle
Es gibt einen Artikel über InfoQ darüber , wie mit Protokollhandler losen gekoppelten Metro - Apps zu bauen. Dies wird von Windows seit langem unterstützt, und man könnte vorhersehen, dass sich eine Desktop-Anwendung als Protokollhandler registriert und die Metro-Anwendung möglicherweise über diesen Mechanismus kommunizieren kann.
Ich habe keine Ahnung, ob dies möglich ist, aber es könnte interessant sein, es zu überprüfen.
quelle
Christophe Nasarre hat gebloggt über einen ziemlich hacky Weg , es zu tun , lokale Dateien. Das Ergebnis ist eine Kommunikation zwischen Desktop-App / Windows Store-App (im Blog als DA / WSA bezeichnet), ohne zwischen der Benutzeroberfläche der beiden Apps wechseln zu müssen. Er bloggte auch über eine andere weniger hackige Technik, an der Protokollhandler beteiligt waren.
Beachten Sie, dass eine WSA, die mit einem DA kommuniziert, durch die Zertifizierungsanforderungen für die Store- App ausdrücklich verboten ist
... aber es schränkt nur "lokale Mechanismen" ein. Ich denke, man kann einen Webdienst für das Routing der Kommunikation erstellen.
quelle
Wenn Sie der Meinung sind, dass Sie eine zusätzliche manuelle Cmd-Operation ausführen können, können Sie Folgendes versuchen:
CheckNetIsolation.exe ist in der winRT-Installation enthalten, sodass nichts extra installiert werden muss.
Ich habe es versucht: Es funktioniert auch nach der Aktualisierung des Pakets.
Wie gezeigt unter: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx
Hier erfahren Sie, wie Sie die Paket-ID für Ihre App ermitteln: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- die-appid-of-a-metro-style-app-
quelle
Es ist möglich, über denselben Dienst von der Metro-App zur Desktop-App auf demselben Computer zu kommunizieren. Ich habe vor einiger Zeit einen einfachen "Proof of Concept" implementiert, wie die WinRT-Sandbox mithilfe des lokalen Dienstes umgangen werden kann. Für die Installation des Dienstes ist noch eine Art "Social Engineering" oder eine direkte Anleitung erforderlich, aber es ist trotzdem möglich.
Ich bin mir jedoch nicht sicher, welche Zertifizierungsregeln für die Kommunikation mit "lokalen Diensten" beim Hinzufügen einer solchen App zum Windows Store gelten.
Probe hier
quelle
Vielleicht habe ich den Punkt verpasst, aber beim Aktivieren der Funktion "Private Netzwerke" kann ich über die lokale IP-Adresse (nicht localhost) eine Verbindung zu einem lokal laufenden (http) Server herstellen. Dies ermöglicht mein Szenario, in dem eine winrt-App mit einer wpf-Desktop-App kommuniziert
quelle