Windows 8'deki bir Metro uygulaması aynı makinedeki arka uç masaüstü uygulamasıyla nasıl iletişim kurabilir?


120

Windows 8 için yeni Metro tarzı uygulamalar kullanılarak oluşturulmuş kullanıcı arabirimine sahip olduğunuz ve aynı yerel makinede (örneğin bir Windows hizmeti uygulaması) masaüstünde çalışan bir .NET uygulamasıyla iletişim kurmasını istediğiniz bir durumda.

Metro uygulaması ile masaüstü uygulaması arasında süreçler arası iletişimin hangi biçimleri mevcuttur?

Buraya bir yorumda bazı ilk bilgiler veren Visual Studio ekibinden Pavel Minaev'e teşekkürler:

Martyn Lovell'e göre, bunun için kasıtlı bir mekanizma yok ve bunun için kullanılabilecek bazıları kasıtlı olarak kısıtlanıyor. Örneğin, adlandırılmış kanallar yoktur, bellek eşlemeli dosyalar da yoktur. Soketler var (sunucu soketleri dahil), ancak localhost'a bağlanırken sadece aynı uygulamaya bağlanabilirsiniz. Normal dosyaları, paylaşılan "bilinen klasörlerden" (Belgeler, Resimler vb.) Birinde kullanabilirsiniz, ancak bu, sorgulama gerektiren ve kullanıcı tarafından görülebilen oldukça kaba bir hack'tir. - Pavel Minaev bu konu hakkında yorum yapıyor

Bu nedenle, başarısız normal yaklaşımlar, bir tür iletişimin gerçekleşmesini sağlamak için web hizmetlerini kullanmayı veya bir veritabanına okuma / yazmayı düşünüyordum, her ikisi de süreçler aynı makinede çalıştığı zaman aşırılık gibi görünüyor.

Burada yapmaya çalıştığım şey mantıklı mı? Masaüstünde çalışan mevcut bir hizmet için bir metro uygulamasının ön uç kullanıcı arayüzü olması gerektiğini görebiliyorum. Veya masaüstünde çalışan ön uç kullanıcı arabirimi için yalnızca WPF kullanmak daha mı iyidir (yani metro olmayan bir uygulama).


2
Yerel bir WCF hizmeti ne olacak?
Gleno

2
@Gleno sorusuna "web servislerini kullanmayı düşünme" konusunu ele alacaktır. Bununla birlikte, işe yarayıp yaramayacağını merak ediyorum - .NET Core'da sağlanan WCF istemci kitaplığının uygulaması WinRT soketlerinin üzerine kuruluysa, muhtemelen aynı "yerel ana bilgisayar yok" kısıtlaması geçerli olacaktır. Bunun kontrol edilmesi gerekiyor.
Pavel Minaev

1
Görünüşe göre WCF'nin NetNamedPipeBinding ve NetTcpBinding (localhost üzerinden) metrodaki kısıtlamalar nedeniyle zaten kullanılamayacak. Bu, web hizmetlerini veya MSMQ bağlarını bırakır mı? Dürüst olmak gerekirse WCF'nin metroda mevcut olup olmadığından emin değilim.
dodgy_coder

6
Sorunuzu tersine çevirip size sormama izin verin: İletişim kurduğunuz masaüstü hizmeti yoksa ne olur? Uygulamanızın yalnızca mağazadan yüklenebileceğini ve bu nedenle masaüstü hizmetinin varlığına güvenemeyeceğini unutmayın.
ReinstateMonica Larry Osterman

3
Görünüşe göre, kuruluşlar özel uygulamaları yükleyebilir ve Windows Mağazası'nı atlayabilir. Öyleyse, bazı uygulamaların işletme ortamında çalıştığını varsaymanız mantıklı olacaktır. Bununla birlikte, orijinal posterin amaçları için bir masaüstü WPF ön ucu kullanması gerektiğini düşünüyorum.
Ankur Goel

Yanıtlar:


54

Şu anda mevcut projemi Win8'e taşıyorum. NamedPipes WCF ile birbirleriyle konuşan windows servisi ve tepsi uygulamasından oluşur. Bildiğiniz gibi, Metro adlandırılmış kanalları desteklemiyor. Tam çift yönlü bağlantı için TcpBinding'i kullandım.

Bu gönderi , hangi işlevselliğin desteklendiğini açıklamaktadır.

Metro istemcisinin kullanabileceği WCF sunucumun örneği burada .

Metro'da zaman uyumlu WCF kullanamayacağınızı da unutmayın. Yalnızca eşzamansız olan Görev tabanlı sarmalayıcıyı kullanmanız gerekecek .

Ve sorunuz için teşekkür ederim. Benim için iyi bir başlangıç ​​noktası oldum :)


7
Bunun için teşekkürler ... bu harika bir yardım. Sadece yapılmaması / yapılmaması gerektiği söylenmek yerine pratik bir cevap görmek güzel.
dodgy_coder

1
Aptalca bir soru olabilir ... ama örneğinizi kullanarak localhost'a bağlanabilir misiniz, yoksa değil mi? Bağlandığınız soru, Visual Studio'nun iç kısımlarını gösterir (bunu yoldan çıkardım, ancak yanılıyorsam lütfen düzeltin). WCF (localhost ile birlikte) WCF dışında çalışır mı?
dzendras

1
@dzendras Elbette, işe yarayacak. Localhost ile de çalışacaktır.
uzman

3
Böyle bir uygulamanın Mağaza sertifikasyonunu geçeceğinden şüpheliyim.
Ani

6
Bu, alıntılanabileceğini düşündüğüm herhangi bir kural ise "3.9 Tüm uygulama mantığı, uygulama paketinizden kaynaklanmalı ve içinde bulunmalıdır Uygulamanız, paket içeriğini herhangi bir dinamik kod dahil etme biçimiyle değiştirmeye veya genişletmeye çalışmamalıdır. Uygulamanın Windows Çalışma Zamanı ile etkileşim şeklini değiştiren veya Mağaza ilkesine göre davranışını değiştiren veriler. Örneğin, bir uzak komut dosyasını indirmeye ve ardından bu komut dosyasını uygulama paketinizin yerel bağlamında yürütmeye izin verilmez. "
Ani

38

Katıldığım bir // yapı / oturumun sonunda buna benzer bir dizi soru vardı. Büyük resim oturumlarından birini yapan yönetici Aleš Holeček, seyircilerin arasından bunları halletmek için çıktı. C ++ geliştiricisi olmasanız bile, o oturumu indirin ve Soru ve Cevap bölümünü izleyin http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Metro uygulamaları, makineye yüklenen masaüstü uygulamalarına veya hizmetlere güvenemez. Ve masaüstü uygulamaları, herhangi bir zamanda askıya alınabilecekleri için, çalışan Metro uygulamalarına güvenemez. Farklı düşünmeye başlamalısın. Bu konuda Aleš'i dinleyin.


6
Tam da bu soru videoda 47: 20'de sorulacak gibi görünüyor.
Pavel Minaev

3
... ve 55: 00'de bir tane daha. Cevap, genel olarak, "hayır, bunu yapamazsın" gibi görünüyor.
Pavel Minaev

1
@dodgy_coder WCF / TCP'nin (veya HTTP) aynı makinede çalışacağından emin değilim. Sanal alan, localhostdoğrudan bir TCP soketi aracılığıyla bağlanmanıza izin vermiyorsa , neden aynısını WCF aracılığıyla yapmanıza izin versin?
Pavel Minaev

2
İlginç bir şekilde, iki metro uygulaması arasında paylaşım sözleşmeleri aracılığıyla iletişim kurmak için yerleşik bir destek var, ancak bu kullanımda panoya benzer ve bir kaynak uygulamadan bir hedef uygulamaya tek yönlü transfer etme gibi görünüyor. yollu iletişim protokolü.
dodgy_coder

4
Bana öyle geliyor ki, yandan yüklenmiş LOB Metro uygulamalarının yüklü bir masaüstü uygulamasına veya hizmetine bağlı olarak hiçbir sorunu olmayacak. Bu çok pratik senaryonun desteklenmeyeceğine inanmakta zorlanıyorum. Silverlight ile, masaüstü / yerel birlikte çalışma yeteneklerinde kademeli bir artış gördük ... Bu senaryolardaki bir şeyin (adlandırılmış kanallar veya bellek eşlemeli dosyalar veya başka bir şey ...) destekleneceğinden eminim (kılavuz belgelerle) gelecekte.
David Cuccia

11

Windows 8.1 Güncellemesi ile, Windows Mağazası uygulamaları ile .NET 4.5+ için C # ile yazılmış masaüstü bileşenleri arasındaki iletişimin artık Kurumsal senaryolarda yandan yüklü uygulamalar için resmi olarak desteklendiğini unutmayın:

Yandan yüklenmiş Windows Mağazası uygulamaları için aracılı Windows Çalışma Zamanı Bileşenleri

Alıntılamak:

Kritik iş işlevlerinin ve kurallarının mevcut yazılım varlıklarında yer aldığını ve işletmelerin yeni uygulama stilinin oldukça üretken olacağı çok çeşitli senaryolara sahip olduğunu kabul eden Windows 8.1 Güncellemesi, yandan yüklemeye yönelik Brokered Windows Runtime Components adlı yeni bir özellik içerir. uygulamalar. IPC (süreçler arası iletişim) terimini, bir Windows Mağazası uygulamasında bu kodla etkileşim halindeyken mevcut masaüstü yazılım varlıklarını bir işlemde (masaüstü bileşeni) çalıştırma yeteneğini tanımlamak için kullanıyoruz. Windows'ta NT Hizmetlerini kullanan veri tabanı uygulamaları ve uygulamaları benzer bir çok işlemli mimariyi paylaştığı için bu, kurumsal geliştiriciler için tanıdık bir modeldir.

Bu yaklaşımı uygulamak başlangıçta biraz karmaşık olsa da, Windows Mağazası ve masaüstü bileşenleri arasında derin bir entegrasyona izin verir. Şimdilik, genel Windows Mağazası sertifikasyonunu geçmeyeceğini unutmayın.


5

Protokol işleyicileriyle gevşek bir şekilde bağlı Metro uygulamalarının nasıl oluşturulacağı hakkında InfoQ hakkında bir makale var . Bu, Windows tarafından uzun süredir desteklenen bir şeydir ve bir masaüstü uygulamasının kendisini bir protokol işleyicisi olarak kaydetmesi öngörülebilir ve belki metro uygulaması bu mekanizma aracılığıyla iletişim kurabilir.

Bunun mümkün olup olmadığı hakkında hiçbir fikrim yok, ancak kontrol etmek ilginç olabilir.


Makalede şöyle diyor: "Metro'da bunu yapmanın yolu [farklı bir uygulamadaki başka bir iş akışına atla - çünkü uygulamanızın küçük ve yüksek düzeyde odaklanmış olması gerekiyor]. Protokollerden yararlanarak. “acme-stok-alım: // istemci = 123 hisse = XYZ &” ". - Teknik olarak "protokollerden yararlanma" ne anlama geliyor?
Lumi

Bu yaklaşımdaki sorun, iletişimin tek yönlü olmasıdır.
uzman

3

Christophe Nasarre, bunu yerel dosyaları kullanarak yapmanın oldukça hilekâr bir yolunu yazdı . Sonuç, iki uygulamanın kullanıcı arabirimi arasında geçiş yapmak zorunda kalmadan masaüstü uygulaması / Windows mağazası uygulaması (blogda DA / WSA olarak anılır) arasındaki iletişimdir. Ayrıca, protokol işleyicileri içeren daha az korsan bir teknik hakkında blog yazdı.

Bir DA ile iletişim kuran bir WSA'ya sahip olmanın , mağaza Uygulaması sertifika gereksinimleri tarafından açıkça yasaklandığını unutmayın .

Windows Mağazası uygulamaları, dosyalar ve kayıt defteri anahtarları dahil yerel mekanizmalar aracılığıyla yerel masaüstü uygulamaları veya hizmetleriyle iletişim kurmamalıdır.

... ancak yalnızca "yerel mekanizmaları" kısıtlar. Sanırım iletişimleri yönlendirmek için bir web servisi oluşturulabilir.


3

Ek bir manuel cmd işlemi yapabileceğinizi düşünüyorsanız, deneyebilirsiniz:

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

CheckNetIsolation.exe, winRT kurulumuna dahildir, dolayısıyla yüklenecek fazladan bir şey yoktur.

Denedim: paket güncellemesinden sonra bile çalışıyor.

Gösterildiği gibi: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Burada, uygulamanız için paket kimliğini nasıl bulacağınız açıklanmıştır: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- -appid-of-a-metro-style-app-


Dahili bir uygulama için localhost ile iletişim kurabilmek istedim ve bu komutu sadece VS çalıştırmayan bilgisayarlarda gerçekleştirebildim.
adosaiguas

2

Yerel hizmeti kullanarak Metro uygulamasından masaüstü uygulamasına aynı makine üzerinden iletişim kurmak mümkündür. Bir süre önce, yerel hizmeti kullanarak WinRT korumalı alanını nasıl atlayacağımı, basit "kavram kanıtı" uyguladım. Hizmetin kurulumu için hala bir tür "sosyal mühendislik" ya da doğrudan rehbere ihtiyaç duyuyor, ancak yine de mümkün.
Böyle bir uygulamayı Windows Mağazası'na eklerken "yerel hizmet" iletişimiyle ilgili sertifika kurallarından emin değilim.

Örnek burada

Tasarım gereği Metro uygulaması, temeldeki PC'ye doğrudan erişemez, yalnızca WinRT API ve mevcut yetenekleri kullanarak. Ancak PC'ye ve oradaki tüm verilere erişmek için arka uç hizmeti oluşturduğunuzda, temelde artık sandbox'ta çalışmıyor.

Tek "sorun", kullanıcının bu arka uç hizmetini manuel olarak yüklemesi gerektiğidir, ancak bu, bazı "sosyal mühendislik" kullanımında bir sorun olmayacaktır: Kullanıcı "PC tarayıcı" Metro uygulamasını indirir, kullanıcı tüm resimlere, müziklere ve videolara göz atabilir , WinRT API kullanarak, ancak uygulama altta şu mesajı da gösteriyor: "PC tarayıcı güç paketimizi indirin ve ÜCRETSİZ olarak tüm PC'nize göz atın"

Kullanıcı, kullanıcıların tüm bilgisayardaki dosyalara erişmek için "PC tarayıcısı" arka uç hizmetini içeren klasik masaüstü yükleyicisini indirebileceği web sayfasına yönlendirilir. Bu masaüstü hizmeti yüklendikten sonra, Metro uygulaması onu algılayabilir ve tüm PC'de gezinmek için kullanabilir. Kullanıcı mutlu, ancak WinRT korumalı alanı tehlikede.

Elbette bu, Windows 8 ARM tabletlerde çalışmayacaktır. Bu geçici çözümü kullanarak, antivirüsler, torrent / P2P istemcileri gibi klasik masaüstü uygulamaları için Metro uygulaması istemcileri oluşturmak bile mümkün olabilir.


3
Neden sosyal mühendislikten bahsetmeniz gerektiğinden emin değilim ... Asıl soru bir metro uygulamasıyla konuşan bir masaüstü uygulaması / hizmetinden bahsettiği için, kullanıcının masaüstü uygulamasını / hizmetini ayrı olarak yüklemesi gerekmesi bekleniyor. Peki masaüstü hizmeti ile metro uygulaması arasında hangi iletişim yöntemini kullandınız?
dodgy_coder

0

Belki noktayı kaçırdım ama Özel ağlar özelliğini etkinleştirirken yerel IP adresini (localhost değil) kullanarak yerel çalışan (http) bir sunucuya bağlanabilirim. Bu, bir winrt uygulamasının bir wpf masaüstü uygulamasıyla iletişim kurduğu senaryomu etkinleştirir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.