W jaki sposób aplikacja Metro w systemie Windows 8 może komunikować się z aplikacją komputerową zaplecza na tym samym komputerze?

120

W sytuacji, gdy masz frontend UI zbudowany przy użyciu nowego stylu Metro aplikacji dla systemu Windows 8 i chciałbyś, aby komunikował się z aplikacją .NET działającą na pulpicie na tym samym komputerze lokalnym (np. Aplikacja usługi Windows).

Jakie formy komunikacji międzyprocesowej są dostępne między aplikacją Metro a aplikacją komputerową?

Podziękowania dla Pavela Minaeva z zespołu Visual Studio, który w komentarzu podał kilka wstępnych informacji:

Według Martyna Lovella nie ma na to celowego mechanizmu, a niektóre, które można by do tego wykorzystać, są celowo ograniczane. Na przykład nie ma nazwanych potoków ani plików mapowanych w pamięci. Istnieją gniazda (w tym gniazda serwera), ale podczas łączenia się z hostem lokalnym można łączyć się tylko z tą samą aplikacją. Możesz użyć zwykłych plików w jednym z udostępnionych „znanych folderów” (Dokumenty, Obrazy itp.), Ale jest to dość prymitywny hack, który wymaga sondowania i jest widoczny dla użytkownika. - komentuje Pavel Minaev w tej sprawie

Tak więc w przypadku niepowodzenia normalnego podejścia myślałem o użyciu usług internetowych lub czytaniu / zapisywaniu w bazie danych w celu uzyskania jakiejś formy komunikacji, z których oba wydają się przesadą, gdy procesy działają na tej samej maszynie.

Czy to, co tu próbuję, ma sens? Widzę potrzebę, aby aplikacja Metro była frontendowym interfejsem użytkownika dla istniejącej usługi działającej na pulpicie. A może lepiej jest po prostu użyć WPF dla interfejsu użytkownika interfejsu użytkownika działającego na pulpicie (tj. Aplikacji innej niż metro).

dodgy_coder
źródło
2
A co z lokalną usługą WCF?
Gleno,
2
@Gleno, które w pytaniu byłoby objęte „myśleniem o korzystaniu z usług internetowych”. To powiedziawszy, zastanawiam się, czy to w ogóle zadziała - jeśli implementacja biblioteki klienta WCF dostarczona w .NET Core jest oparta na gniazdach WinRT, to przypuszczalnie obowiązywałoby to samo ograniczenie „no localhost”. Należy to sprawdzić.
Pavel Minaev,
1
Wygląda na to, że NetNamedPipeBinding i NetTcpBinding (over localhost) programu WCF nie byłyby dostępne z powodu ograniczeń w metrze. To spowodowałoby pozostawienie usług internetowych lub powiązań usługi MSMQ? Szczerze mówiąc, nie jestem pewien, czy samo WCF jest dostępne w metrze.
dodgy_coder,
6
Pozwól, że odwrócę twoje pytanie i zapytam: Co się stanie, jeśli usługa pulpitu, z którą się komunikujesz, nie jest obecna? Pamiętaj, że Twoja aplikacja może być zainstalowana tylko ze sklepu i dlatego nie może polegać na obecności usługi desktopowej.
Przywróć Monikę Larry Osterman
3
Wygląda na to, że przedsiębiorstwa mogą pobierać niestandardowe aplikacje i ominąć Sklep Windows. Jeśli tak, rozsądne byłoby założenie, że niektóre aplikacje działają w środowisku przedsiębiorstwa. To powiedziawszy, myślę, że oryginalny plakat powinien wykorzystywać do swoich celów frontend WPF dla komputerów stacjonarnych.
Ankur Goel

Odpowiedzi:

54

W tej chwili przenoszę mój istniejący projekt na Win8. Składa się z usługi systemu Windows i aplikacji zasobnika, które komunikują się ze sobą za pośrednictwem NamedPipes WCF. Jak być może już wiesz, Metro nie obsługuje nazwanych potoków. Skończyło się na użyciu TcpBinding do połączenia w trybie pełnego dupleksu.

W tym poście opisano, jakie funkcje są obsługiwane.

Przykład mojego serwera WCF, z którego może korzystać klient Metro, znajduje się tutaj .

Należy również pamiętać, że nie można używać synchronicznego WCF w Metro. Będziesz musiał użyć Task -na owijkę, która jest tylko asynchroniczny.

Dziękuję za pytanie. Byłem dla mnie dobrym punktem wyjścia :)

ekspert
źródło
7
Dzięki za to ... to wielka pomoc. Dobrze jest zobaczyć praktyczną odpowiedź zamiast po prostu powiedzieć, że nie powinno / nie można tego zrobić.
dodgy_coder
1
To może być głupie pytanie ... ale możesz połączyć się z localhost używając swojej próbki, czy nie? Pytanie, do którego tworzysz link, pokazuje elementy wewnętrzne programu Visual Studio (wydedukowałem to ze ścieżki, ale jeśli się mylę, popraw mnie). Czy WCF (w połączeniu z localhost) działa poza WCF?
dzendras
1
@dzendras Jasne, to zadziała. Będzie działać również z localhost.
ekspert
3
Wątpię jednak, by taka aplikacja przeszła certyfikację Sklepu.
Ani
6
Jeśli cokolwiek to jest reguła, którą myślę, że można ją zacytować "3.9 Cała logika aplikacji musi pochodzić z pakietu aplikacji i znajdować się w nim. Aplikacja nie może próbować zmieniać ani rozszerzać zawartości pakietu poprzez jakąkolwiek formę dynamicznego dołączania kodu lub dane, które zmieniają sposób, w jaki aplikacja współdziała ze środowiskiem wykonawczym systemu Windows lub zachowuje się w odniesieniu do zasad Sklepu. Niedozwolone jest na przykład pobieranie zdalnego skryptu, a następnie wykonywanie tego skryptu w lokalnym kontekście pakietu aplikacji. "
Ani
38

Pod koniec // budowania / sesji, w której uczestniczyłem, pojawiło się wiele takich pytań. Aleš Holeček, wykonawca, który zrobił jedną z dużych sesji zdjęciowych, wyszedł z widowni, aby się nimi zająć. Nawet jeśli nie jesteś programistą C ++, pobierz tę sesję i obejrzyj pytania i odpowiedzi http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Aplikacje Metro nie mogą liczyć na zainstalowanie aplikacji komputerowych lub usług na komputerze. A aplikacje komputerowe nie mogą liczyć na uruchomione aplikacje Metro, ponieważ można je zawiesić w dowolnym momencie. Musisz zacząć myśleć inaczej. Posłuchajcie tego Aleša.

Kate Gregory
źródło
6
Wydaje się, że dokładnie to pytanie zostało zadane w filmie o godzinie 47:20.
Pavel Minaev,
3
... i jeszcze jeden o 55:00. Ogólnie rzecz biorąc, odpowiedź brzmi „nie, nie możesz tego zrobić”.
Pavel Minaev
1
@dodgy_coder Nie jestem pewien, czy WCF / TCP (lub HTTP) będzie działać na tym samym komputerze. Jeśli piaskownica nie pozwala łączyć się localhostbezpośrednio przez gniazdo TCP, dlaczego miałoby to robić za pośrednictwem WCF?
Pavel Minaev
2
Co ciekawe, istnieje wbudowana obsługa komunikacji między dwiema aplikacjami metra za pośrednictwem umów akcji, ale wydaje się, że jest to podobne w użyciu do schowka i przenoszenia w jedną stronę z aplikacji źródłowej do aplikacji docelowej, a nie do implementacji, powiedzmy, dwóch -drożny protokół komunikacyjny.
dodgy_coder
4
Wydaje mi się, że aplikacje LOB Metro ładowane z boku nie miałyby problemu w zależności od zainstalowanej aplikacji komputerowej lub usługi. Trudno mi uwierzyć, że ten bardzo praktyczny scenariusz nie będzie obsługiwany. Dzięki Silverlight zauważyliśmy stopniowy wzrost możliwości współpracy między komputerami stacjonarnymi / natywnymi ... Jestem prawie pewien, że coś w tych scenariuszach (nazwane potoki lub pliki mapowane w pamięci lub coś ...) będzie obsługiwane (z dokumentacją z wytycznymi) w przyszłości.
David Cuccia
11

Zwróć uwagę, że dzięki Windows 8.1 Update komunikacja między aplikacjami ze Sklepu Windows i składnikami pulpitu napisanymi w języku C # dla .NET 4.5+ jest teraz oficjalnie obsługiwana dla aplikacji ładowanych z boku w scenariuszach dla przedsiębiorstw:

Obsługiwane przez brokera składniki środowiska wykonawczego systemu Windows dla ładowanych z boku aplikacji ze Sklepu Windows

Cytować:

Uznając, że krytyczne funkcje i reguły biznesowe są zawarte w istniejących zasobach oprogramowania i że przedsiębiorstwa mają wiele różnych scenariuszy, w których nowy styl aplikacji będzie wysoce produktywny, aktualizacja systemu Windows 8.1 zawiera nową funkcję o nazwie Brokered Windows Runtime Components do ładowania bocznego Aplikacje. Używamy terminu IPC (komunikacja między procesami) do opisania możliwości uruchamiania istniejących zasobów oprogramowania komputerowego w jednym procesie (komponent pulpitu) podczas interakcji z tym kodem w aplikacji Sklepu Windows. Jest to model znany programistom korporacyjnym, ponieważ aplikacje baz danych i aplikacje korzystające z usług NT w systemie Windows mają podobną architekturę wieloprocesową.

Chociaż wdrożenie tego podejścia jest początkowo nieco skomplikowane, pozwala na głęboką integrację w Sklepie Windows i składnikach pulpitu. Pamiętaj tylko, że na razie nie przejdzie certyfikacji publicznego Sklepu Windows.

ig2r
źródło
5

Jest artykuł na InfoQ o tym, jak budować aplikacje Metro luźno połączonych z obsługą protokołów. Jest to coś, co jest obsługiwane przez Windows od dawna i można by przewidzieć, że aplikacja desktopowa zarejestruje się jako program obsługi protokołu i być może aplikacja metra będzie się komunikować za pośrednictwem tego mechanizmu.

Nie mam pojęcia, czy jest to możliwe, ale warto to sprawdzić.

tronda
źródło
W artykule czytamy: „Sposób, w jaki możesz to zrobić w Metro [przeskoczyć do innego przepływu pracy w innej aplikacji - ponieważ Twoja aplikacja ma być mała i wysoce skoncentrowana] polega na wykorzystaniu protokołów. W naszym przykładzie powyżej protokół może wyglądać tak „Acme-stock-purchase: // client = 123 & stock = XYZ”. - Tylko co to technicznie oznacza „wykorzystanie protokołów”?
Lumi,
Problem z tym podejściem polega na tym, że jest to komunikacja tylko w jedną stronę.
ekspert
3

Christophe Nasarre napisał na blogu o dość hakerskim sposobie zrobienia tego przy użyciu lokalnych plików. Rezultatem jest komunikacja między aplikacją komputerową / aplikacją sklepu Windows (określaną na blogu jako DA / WSA), bez konieczności przełączania się między interfejsem użytkownika obu aplikacji. Opublikował również na blogu o innej, mniej hakerskiej technice związanej z obsługą protokołów.

Należy pamiętać, że posiadanie WSA, który komunikuje się z DA, jest wyraźnie zabronione przez wymagania certyfikacji aplikacji sklepu

Aplikacje ze Sklepu Windows nie mogą komunikować się z lokalnymi aplikacjami lub usługami komputerowymi za pośrednictwem mechanizmów lokalnych, w tym plików i kluczy rejestru.

... ale ogranicza tylko „mechanizmy lokalne”. Więc myślę, że można zbudować usługę sieciową do routingu komunikacji.

twj
źródło
3

Jeśli uważasz, że możesz wykonać dodatkową ręczną operację cmd, możesz spróbować:

X:/> CheckNetIsolation.exe LoopbackExempt a n=<packageID>;

CheckNetIsolation.exe jest zawarty w instalacji winRT, więc nie ma nic dodatkowego do zainstalowania.

Wypróbowałem to: działa, nawet po aktualizacji pakietu.

Jak pokazano na: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Tutaj wyjaśniono, jak znaleźć identyfikator pakietu dla swojej aplikacji: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- appid-of-a-metro-style-app-

fgalliat
źródło
Chciałem móc komunikować się z lokalnym hostem dla wewnętrznej aplikacji i mogłem to zrobić tylko na komputerach, na których nie jest uruchomiony VS za pomocą tego polecenia.
adosaiguas
2

Na tym samym komputerze można komunikować się z aplikacji Metro do aplikacji na komputer za pomocą usługi lokalnej. Zaimplementowałem jakiś czas temu prosty "dowód słuszności koncepcji", jak ominąć piaskownicę WinRT za pomocą usługi lokalnej. Nadal potrzebuje jakiejś „socjotechniki” lub bezpośredniego przewodnika po instalacji usługi, ale i tak jest to możliwe.
Nie jestem jednak pewien co do zasad certyfikacji komunikacji „usługi lokalnej” przy dodawaniu takiej aplikacji do Sklepu Windows.

Próbka tutaj

Zgodnie z projektem aplikacja Metro nie może uzyskać bezpośredniego dostępu do komputera PC, korzystając jedynie z interfejsu API WinRT i dostępnych funkcji. Ale kiedy tworzysz usługę zaplecza, aby uzyskać dostęp do komputera i wszystkich danych, w zasadzie nie działa ona już w piaskownicy.

Jedynym „problemem” jest to, że użytkownik musi ręcznie zainstalować tę usługę zaplecza, ale nie będzie to stanowić problemu przy użyciu „inżynierii społecznej”: użytkownik pobiera aplikację Metro „przeglądarkę na komputery PC”, użytkownik może przeglądać wszystkie zdjęcia, muzykę i filmy , używając interfejsu API WinRT, ale aplikacja wyświetla również komunikat na dole: „Pobierz nasz pakiet do przeglądarki na PC i przeglądaj cały komputer ZA DARMO”

Użytkownik zostaje przekierowany na stronę internetową, skąd może pobrać klasyczny instalator pulpitu zawierający usługę zaplecza „przeglądarki PC”, umożliwiającą dostęp do plików na całym komputerze użytkownika. Po zainstalowaniu tej usługi komputerowej aplikacja Metro może ją wykryć i użyć do przeglądania całego komputera. Użytkownik jest zadowolony, ale piaskownica WinRT jest zagrożona.

Oczywiście to nie zadziała na tabletach z systemem Windows 8 ARM. Korzystając z tego obejścia, można nawet zbudować klientów aplikacji Metro dla klasycznych aplikacji komputerowych, takich jak programy antywirusowe, klienci torrent / P2P itp.

Martin Suchan
źródło
3
Nie jestem pewien, dlaczego musisz wspomnieć o inżynierii społecznej ... ponieważ pierwotne pytanie dotyczy aplikacji / usługi komputerowej komunikującej się z aplikacją metra, oczekuje się, że użytkownik będzie musiał zainstalować aplikację / usługę komputerową oddzielnie. Więc jakiej metody komunikacji użyłeś między usługą komputerową a aplikacją Metro?
dodgy_coder
0

Może przegapiłem punkt, ale po aktywacji funkcji sieci prywatnych mogę połączyć się z lokalnym serwerem działającym (http) przy użyciu lokalnego adresu IP (nie localhost). Umożliwia to mój scenariusz, w którym aplikacja winrt komunikuje się z aplikacją komputerową wpf

Wendelin
źródło