Bagaimana aplikasi Metro di Windows 8 berkomunikasi dengan aplikasi desktop backend di komputer yang sama?

120

Dalam situasi di mana Anda memiliki antarmuka UI yang dibangun menggunakan gaya aplikasi Metro baru untuk windows 8, dan ingin berkomunikasi dengan aplikasi .NET yang berjalan di desktop pada mesin lokal yang sama (mis. Aplikasi layanan Windows).

Bentuk komunikasi antarproses apa yang tersedia antara aplikasi metro dan aplikasi desktop?

Terima kasih kepada Pavel Minaev dari tim Visual Studio, yang telah memberikan beberapa info awal di sini dalam sebuah komentar, dikutip:

Menurut Martyn Lovell, tidak ada mekanisme yang disengaja untuk itu, dan beberapa yang dapat digunakan untuk itu sengaja dibatasi. Pipa bernama tidak ada, misalnya, juga tidak ada file yang dipetakan memori. Ada soket (termasuk soket server), tetapi saat terhubung ke localhost, Anda hanya dapat terhubung ke aplikasi yang sama. Anda dapat menggunakan file normal di salah satu "folder yang dikenal" bersama (Dokumen, Gambar, dll), tetapi itu adalah peretasan yang cukup kasar yang memerlukan polling dan dapat dilihat oleh pengguna. - Pavel Minaev mengomentari masalah ini

Jadi karena kegagalan pendekatan normal saya berpikir untuk menggunakan layanan web atau membaca / menulis ke database untuk mendapatkan beberapa bentuk komunikasi yang terjadi, keduanya tampak seperti berlebihan ketika proses berjalan pada mesin yang sama.

Apakah yang saya coba di sini masuk akal? Saya melihat perlunya aplikasi metro menjadi antarmuka antarmuka untuk layanan yang sudah ada yang berjalan di desktop. Atau lebih baik menggunakan WPF untuk antarmuka antarmuka yang berjalan di desktop (yaitu aplikasi non-metro).

dodgy_coder
sumber
2
Bagaimana dengan layanan WCF lokal?
Gleno
2
@Gleno yang akan membahas tentang "berpikir untuk menggunakan layanan web" dalam pertanyaan. Yang mengatakan, saya bertanya-tanya apakah itu akan berhasil - jika implementasi pustaka klien WCF yang disediakan di .NET Core dibangun di atas soket WinRT, maka mungkin pembatasan "tidak ada localhost" yang sama akan berlaku. Ini perlu diperiksa.
Pavel Minaev
1
Sepertinya NetNamedPipeBinding dan NetTcpBinding (melalui localhost) WCF tidak akan tersedia karena pembatasan di metro. Itu akan meninggalkan layanan web atau pengikatan MSMQ? Saya tidak yakin apakah WCF itu sendiri tersedia di metro, jujur ​​saja.
dodgy_coder
6
Izinkan saya membalik pertanyaan Anda dan bertanya: Apa yang terjadi jika layanan desktop yang Anda ajak berkomunikasi tidak ada? Ingatlah bahwa aplikasi Anda hanya dapat dipasang dari toko dan oleh karena itu tidak dapat bergantung pada keberadaan layanan desktop.
ReinstateMonica Larry Osterman
3
Tampaknya perusahaan dapat melakukan sideload aplikasi khusus dan melewati Windows Store. Jika demikian, akan masuk akal jika Anda dapat mengasumsikan beberapa aplikasi berjalan di lingkungan perusahaan. Karena itu, saya pikir poster asli harus menggunakan frontend WPF desktop untuk tujuannya.
Ankur Goel

Jawaban:

54

Saya sedang mem-porting proyek saya yang ada ke Win8 sekarang. Ini terdiri dari layanan windows dan aplikasi baki yang berbicara satu sama lain melalui NamedPipes WCF. Seperti yang Anda ketahui, Metro tidak mendukung pipa bernama. Saya akhirnya menggunakan TcpBinding untuk koneksi dupleks penuh.

Posting ini menjelaskan fungsionalitas apa yang didukung.

Contoh server WCF saya yang dapat digunakan klien Metro ada di sini .

Juga perlu diingat bahwa Anda tidak dapat menggunakan WCF sinkron di Metro. Anda harus menggunakan Task berbasis wrapper yang hanya asynchronous.

Dan terima kasih atas pertanyaan Anda. Saya adalah titik awal yang baik untuk saya :)

ahli
sumber
7
Terima kasih untuk ini ... itu sangat membantu. Ada baiknya melihat jawaban praktis daripada hanya diberi tahu bahwa itu tidak boleh / tidak bisa dilakukan.
dodgy_coder
1
Ini mungkin pertanyaan yang bodoh ... tetapi Anda dapat terhubung ke localhost menggunakan sampel Anda atau tidak? Pertanyaan yang Anda tautkan menunjukkan internal Visual Studio (saya menyimpulkannya dari jalur, tetapi jika saya salah, tolong perbaiki saya). Apakah WCF (digabungkan dengan localhost) bekerja di luar WCF?
dzendras
1
@dzendras Tentu, ini akan berhasil. Ini akan bekerja dengan localhost juga.
pakar
3
Saya ragu aplikasi seperti ini akan lulus sertifikasi Store.
Ani
6
Jika ada aturan yang menurut saya mungkin dikutip "3.9. Semua logika aplikasi harus berasal dari, dan berada di, paket aplikasi Anda. Aplikasi Anda tidak boleh mencoba mengubah atau memperluas konten yang dikemas melalui segala bentuk penyertaan kode yang dinamis atau data yang mengubah cara aplikasi berinteraksi dengan Windows Runtime, atau berperilaku terkait dengan kebijakan Store. Tidak diizinkan, misalnya, untuk mendownload skrip jarak jauh dan kemudian menjalankan skrip tersebut dalam konteks lokal paket aplikasi Anda. "
Ani
38

Ada sejumlah pertanyaan seperti ini di akhir // build / sesi yang saya hadiri. Aleš Holeček, eksekutif yang melakukan salah satu sesi gambar besar, keluar dari penonton untuk menanganinya. Meskipun Anda bukan pengembang C ++, unduh sesi itu dan tonton Tanya Jawab http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Aplikasi Metro tidak dapat mengandalkan aplikasi atau layanan desktop yang diinstal di mesin. Dan aplikasi desktop tidak dapat mengandalkan aplikasi Metro yang berjalan karena dapat ditangguhkan kapan saja. Anda perlu mulai berpikir secara berbeda. Dengarkan Aleš yang satu ini.

Kate Gregory
sumber
6
Pertanyaan yang tepat ini sepertinya ditanyakan pada 47:20 dalam video.
Pavel Minaev
3
... dan satu lagi pada pukul 55:00. Jawabannya, secara umum, tampaknya "tidak, Anda tidak bisa melakukan itu".
Pavel Minaev
1
@dodgy_coder Saya tidak yakin WCF / TCP (atau HTTP) akan bekerja pada mesin yang sama. Jika kotak pasir tidak memungkinkan Anda terhubung localhostsecara langsung melalui soket TCP, mengapa Anda dapat melakukan hal yang sama melalui WCF?
Pavel Minaev
2
Menariknya, ada dukungan bawaan untuk berkomunikasi antara dua aplikasi metro melalui kontrak berbagi tetapi ini tampaknya serupa dalam penggunaan ke clipboard, dan untuk mentransfer satu arah dari aplikasi sumber ke aplikasi target, daripada untuk mengimplementasikan katakanlah dua protokol komunikasi jalan.
dodgy_coder
4
Menurut saya, aplikasi LOB Metro yang dimuat samping tidak akan memiliki masalah tergantung pada aplikasi atau layanan desktop yang diinstal. Saya kesulitan mempercayai skenario yang sangat praktis ini tidak akan didukung. Dengan Silverlight, kami melihat peningkatan bertahap dalam kemampuan interop desktop / asli ... Saya cukup yakin sesuatu di sepanjang skenario ini (bernama pipa, atau file yang dipetakan memori, atau sesuatu ...) akan didukung (dengan dokumen panduan) di masa depan.
David Cuccia
11

Perhatikan bahwa dengan Pembaruan Windows 8.1, komunikasi antara aplikasi Windows Store dan komponen desktop yang ditulis dalam C # untuk .NET 4.5+ sekarang secara resmi didukung untuk aplikasi yang dimuat samping dalam skenario Perusahaan:

Komponen Runtime Windows yang Dirusak untuk aplikasi Windows Store yang dimuat samping

Kutipan:

Menyadari bahwa fungsi dan aturan bisnis yang penting diwujudkan dalam aset perangkat lunak yang ada dan bahwa perusahaan memiliki berbagai skenario yang gaya aplikasi baru akan sangat produktif, Pembaruan Windows 8.1 menyertakan fitur baru yang disebut Komponen Runtime Windows yang Dirusak untuk dimuat samping aplikasi. Kami menggunakan istilah IPC (komunikasi antar-proses) untuk menggambarkan kemampuan menjalankan aset perangkat lunak desktop yang ada dalam satu proses (komponen desktop) saat berinteraksi dengan kode ini di aplikasi Windows Store. Ini adalah model yang akrab bagi pengembang perusahaan karena aplikasi dan aplikasi basis data yang menggunakan Layanan NT di Windows berbagi arsitektur multi-proses yang serupa.

Meskipun menerapkan pendekatan ini pada awalnya agak rumit, ini memungkinkan integrasi yang mendalam di seluruh komponen Windows Store dan desktop. Ingatlah bahwa untuk saat ini, itu tidak akan lulus sertifikasi Windows Store publik.

ig2r
sumber
5

Ada artikel di InfoQ tentang cara membuat aplikasi Metro yang digabungkan secara longgar dengan penangan protokol. Ini adalah sesuatu yang telah didukung oleh Windows sejak lama dan aplikasi desktop dapat meramalkan dirinya sendiri sebagai penangan protokol dan mungkin aplikasi metro dapat berkomunikasi melalui mekanisme ini.

Saya tidak tahu apakah ini mungkin, tetapi mungkin menarik untuk dilihat.

tronda
sumber
Artikel tersebut mengatakan: "Cara Anda dapat melakukan ini di Metro [beralih ke alur kerja lain di aplikasi lain - karena aplikasi Anda dimaksudkan untuk menjadi kecil dan sangat terfokus] adalah dengan memanfaatkan protokol. Untuk contoh kami di atas, protokol mungkin terlihat seperti “Acme-stock-purchase: // client = 123 & stock = XYZ”. " - Apa artinya secara teknis, "memanfaatkan protokol"?
Lumi
Masalah dengan pendekatan ini adalah bahwa itu hanya komunikasi satu arah.
ahli
3

Christophe Nasarre telah membuat blog tentang cara yang agak hack untuk melakukannya menggunakan file lokal. Hasilnya adalah komunikasi antara aplikasi desktop / aplikasi windows store (disebut sebagai DA / WSA di blog), tanpa harus beralih antar UI dari kedua aplikasi tersebut. Dia juga membuat blog tentang teknik lain yang tidak terlalu hacky yang melibatkan penangan protokol.

Perhatikan bahwa memiliki WSA yang berkomunikasi dengan DA secara eksplisit dilarang oleh persyaratan sertifikasi Aplikasi toko

Aplikasi Windows Store tidak boleh berkomunikasi dengan aplikasi atau layanan desktop lokal melalui mekanisme lokal, termasuk melalui file dan kunci registri.

... tetapi hanya membatasi "mekanisme lokal". Jadi saya kira seseorang dapat membangun layanan web untuk merutekan komunikasi.

twj
sumber
3

Jika Anda merasa dapat membuat operasi cmd manual tambahan, Anda dapat mencoba:

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

CheckNetIsolation.exe disertakan dalam pemasangan winRT, jadi tidak ada tambahan yang harus dipasang.

Saya mencobanya: berhasil, bahkan setelah pembaruan paket.

Seperti yang ditunjukkan di: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Di sini dijelaskan cara mengetahui packageID untuk aplikasi Anda: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- the-appid-of-a-metro-style-app-

fgalliat.dll
sumber
Saya ingin dapat berkomunikasi dengan localhost untuk aplikasi internal dan saya hanya bisa mewujudkannya di komputer yang tidak menjalankan VS menggunakan perintah ini.
adosaiguas
2

Dimungkinkan untuk berkomunikasi pada mesin yang sama dari aplikasi Metro ke aplikasi desktop menggunakan layanan lokal. Saya telah menerapkan beberapa waktu yang lalu "bukti konsep" sederhana, bagaimana melewati kotak pasir WinRT menggunakan layanan lokal. Ini masih membutuhkan semacam "manipulasi psikologis" atau panduan langsung untuk menginstal layanan, tapi bagaimanapun, itu mungkin.
Saya tidak yakin tentang aturan sertifikasi tentang komunikasi "layanan lokal" ketika menambahkan aplikasi semacam itu ke Windows Store.

Cicipi di sini

Secara desain, aplikasi Metro tidak dapat mengakses PC yang mendasarinya secara langsung, hanya menggunakan WinRT API dan kemampuan yang tersedia. Tetapi ketika Anda membuat layanan back-end untuk mengakses PC dan semua data di sana, pada dasarnya tidak lagi berjalan di kotak pasir.

Satu-satunya "masalah" adalah pengguna harus menginstal layanan back-end ini secara manual, tetapi itu tidak akan menjadi masalah menggunakan beberapa "manipulasi psikologis": Pengguna mengunduh aplikasi Metro "browser PC", pengguna dapat menelusuri semua gambar, musik, dan video , menggunakan WinRT API, tetapi aplikasi juga menampilkan pesan di bagian bawah: "Unduh powerpack browser PC kami dan telusuri seluruh PC Anda, GRATIS"

Pengguna dialihkan ke halaman web, dari mana pengguna dapat mengunduh penginstal desktop klasik yang berisi layanan back-end "browser PC" untuk mengakses file di seluruh PC pengguna. Setelah layanan desktop ini dipasang, aplikasi Metro dapat mendeteksinya dan menggunakannya untuk menjelajahi seluruh PC. Pengguna senang, tetapi kotak pasir WinRT dikompromikan.

Tentu saja ini tidak akan berfungsi pada tablet ARM Windows 8. Menggunakan solusi ini, bahkan dimungkinkan untuk membangun klien aplikasi Metro untuk aplikasi desktop klasik seperti antivirus, klien torrent / P2P, dll.

Martin Suchan
sumber
3
Tidak yakin mengapa Anda perlu menyebutkan tentang manipulasi psikologis ... karena pertanyaan aslinya adalah berbicara tentang aplikasi / layanan desktop yang berbicara dengan aplikasi metro, diharapkan pengguna perlu menginstal aplikasi / layanan desktop secara terpisah. Jadi, metode komunikasi apa yang Anda gunakan antara layanan desktop dan aplikasi metro?
dodgy_coder
0

Mungkin saya melewatkan intinya tetapi ketika mengaktifkan kemampuan jaringan Pribadi saya dapat terhubung ke server lokal (http) yang menggunakan alamat IP lokal (bukan localhost). Ini memungkinkan skenario saya di mana aplikasi winrt berkomunikasi dengan aplikasi desktop wpf

Wendelin
sumber