Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan berbagai cara untuk melakukan komunikasi antarproseksi (IPC) antara aplikasi desktop SDK Aplikasi Windows dan aplikasi Win32 lainnya. Karena aplikasi desktop SDK Aplikasi Windows berjalan sebagai proses Win32 tepercaya penuh, aplikasi tersebut memiliki akses langsung ke semua mekanisme IPC tingkat sistem operasi. Beberapa mekanisme memiliki persyaratan tambahan saat aplikasi dipaketkan dengan MSIX, seperti yang tercantum di bagian di bawah ini.
Layanan aplikasi
Layanan aplikasi memungkinkan aplikasi untuk mengekspos layanan yang menerima dan mengembalikan kantong properti primitif (ValueSet) di latar belakang. Objek kaya dapat diteruskan jika diserialisasikan.
Layanan aplikasi dapat berjalan baik di luar proses sebagai tugas latar belakang, maupun di dalam proses dalam aplikasi latar depan.
Note
Layanan aplikasi memerlukan aplikasi yang dipaketkan dengan identitas paket. Mereka tersedia untuk aplikasi SDK Aplikasi Windows yang menggunakan paket MSIX.
Layanan aplikasi paling baik digunakan untuk berbagi data dalam jumlah kecil di mana latensi mendekati real-time tidak diperlukan.
COM
COM adalah sistem berorientasi objek terdistribusi untuk membuat komponen perangkat lunak biner yang dapat berinteraksi dan berkomunikasi. Sebagai pengembang, Anda menggunakan COM untuk membuat komponen perangkat lunak dan lapisan otomatisasi yang dapat digunakan kembali untuk aplikasi. Komponen COM dapat dalam proses atau di luar proses, dan mereka dapat berkomunikasi melalui model klien dan server . Server COM di luar proses telah lama digunakan sebagai sarana untuk komunikasi antar objek.
Aplikasi paket dengan kapabilitas runFullTrust dapat mendaftarkan server COM di luar proses untuk IPC melalui manifes paket. Ini dikenal sebagai COM yang Dipaketkan.
SDK Aplikasi Windows aplikasi desktop berjalan sebagai proses kepercayaan penuh, sehingga mereka juga dapat mendaftar dan menggunakan server COM langsung melalui Windows Registry, sama seperti aplikasi Win32 tradisional.
Filesystem
BroadFileSystemAccess
Aplikasi yang dikemas dapat melakukan IPC menggunakan sistem file yang luas dengan mendeklarasikan kemampuan terbatas broadFileSystemAccess . Kemampuan ini memberikan Windows. API Penyimpanan dan akses API FromApp Win32 ke sistem file yang luas.
Secara default, IPC melalui sistem file untuk aplikasi paket dibatasi untuk mekanisme lain yang dijelaskan di bagian ini.
PublisherCacheFolder
PublisherCacheFolder memungkinkan aplikasi yang dikemas untuk mendeklarasikan folder dalam manifesnya yang dapat dibagikan dengan paket lain oleh penerbit yang sama.
Folder penyimpanan bersama memiliki persyaratan dan batasan berikut:
- Data di folder penyimpanan bersama tidak dicadangkan atau disinkronkan.
- Pengguna dapat menghapus konten folder penyimpanan bersama.
- Anda tidak dapat menggunakan folder penyimpanan bersama untuk berbagi data di antara aplikasi dari penerbit yang berbeda.
- Anda tidak dapat menggunakan folder penyimpanan bersama untuk berbagi data di antara pengguna yang berbeda.
- Folder penyimpanan bersama tidak memiliki manajemen versi.
Jika Anda menerbitkan beberapa aplikasi dan mencari mekanisme sederhana untuk berbagi data di antaranya, maka PublisherCacheFolder adalah opsi berbasis sistem file sederhana.
Pipa
Pipa memungkinkan komunikasi sederhana antara server pipa dan satu atau beberapa klien pipa.
Pipa anonim dan pipa bernama didukung dengan batasan berikut:
- Secara bawaan, named pipe dalam aplikasi yang dipaketkan hanya didukung antarproses dalam paket yang sama, kecuali suatu proses berjalan dengan full trust.
- Named pipe dapat dibagikan antarpaket sesuai dengan panduan tentang berbagi objek bernama.
- Pipa bernama dalam aplikasi kemasan harus disertakan
LOCAL\dalam nama pipa (misalnya,\\.\pipe\LOCAL\<pipename>). SegmenLOCAL\membatasi cakupan pipe ke sesi masuk pemanggil dan diperlukan untuk aplikasi yang dikemas dengan MSIX. Saat menggunakan API .NET sepertiNamedPipeServerStream, berikan hanya bagianLOCAL\<pipename>— prefiks\\.\pipe\ditangani secara internal.
Aplikasi desktop SDK Aplikasi Windows berjalan sebagai proses dengan kepercayaan penuh, sehingga dapat membuat dan menggunakan named pipe tanpa batasan harus berada dalam paket yang sama. Namun, jika Anda berkomunikasi dengan aplikasi paket lain yang tidak memiliki kepercayaan penuh, batasan di atas masih berlaku.
Contoh pipa bernama (C#)
Contoh berikut mendemonstrasikan server dan klien pipa bernama yang lengkap, sebagai dua aplikasi konsol. Karena aplikasi desktop SDK Aplikasi Windows adalah proses tepercaya penuh, IPC pipa bernama berfungsi tanpa kemampuan khusus atau entri manifes.
Untuk mencoba contoh ini, buat dua proyek aplikasi konsol (penargetan net8.0-windows dengan ImplicitUsings diaktifkan) dan jalankan server terlebih dahulu, lalu klien di terminal terpisah.
Server pipa — membuat pipa bernama dan mengirimkan kembali pesan ke klien:
using System.Text;
string PipeName = @"LOCAL\WinAppSdkIpcDemo";
Console.WriteLine("Named Pipe Server");
Console.WriteLine($" Process ID: {Environment.ProcessId}");
Console.WriteLine($" User: {Environment.UserName}");
Console.WriteLine($" Pipe: \\\\.\\pipe\\{PipeName}");
Console.WriteLine();
using var server = new System.IO.Pipes.NamedPipeServerStream(
PipeName,
System.IO.Pipes.PipeDirection.InOut,
maxNumberOfServerInstances: 1,
System.IO.Pipes.PipeTransmissionMode.Message,
System.IO.Pipes.PipeOptions.Asynchronous);
Console.WriteLine("Waiting for client...");
await server.WaitForConnectionAsync();
Console.WriteLine("Client connected!");
byte[] buffer = new byte[4096];
while (server.IsConnected)
{
try
{
int bytesRead = await server.ReadAsync(buffer);
if (bytesRead == 0) break;
string received = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($" Received: \"{received}\"");
if (received.Equals("QUIT", StringComparison.OrdinalIgnoreCase))
break;
// Echo the message back with the server's process ID
string reply = $"Echo from PID {Environment.ProcessId}: {received}";
await server.WriteAsync(Encoding.UTF8.GetBytes(reply));
await server.FlushAsync();
}
catch (IOException)
{
break;
}
}
Console.WriteLine("Done.");
Klien pipa — terhubung ke server dan mengirim input pengguna:
using System.Text;
string PipeName = @"LOCAL\WinAppSdkIpcDemo";
Console.WriteLine("Named Pipe Client");
Console.WriteLine($" Process ID: {Environment.ProcessId}");
Console.WriteLine();
using var client = new System.IO.Pipes.NamedPipeClientStream(
serverName: ".",
pipeName: PipeName,
System.IO.Pipes.PipeDirection.InOut,
System.IO.Pipes.PipeOptions.Asynchronous);
Console.WriteLine("Connecting...");
await client.ConnectAsync(timeout: 5000);
client.ReadMode = System.IO.Pipes.PipeTransmissionMode.Message;
Console.WriteLine("Connected! Type messages (or QUIT to exit):");
byte[] buffer = new byte[4096];
while (true)
{
Console.Write("> ");
string? input = Console.ReadLine();
if (string.IsNullOrEmpty(input)) continue;
await client.WriteAsync(Encoding.UTF8.GetBytes(input));
await client.FlushAsync();
if (input.Equals("QUIT", StringComparison.OrdinalIgnoreCase))
break;
int bytesRead = await client.ReadAsync(buffer);
string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($" <- {response}");
}
Console.WriteLine("Done.");
Saat Anda menjalankan kedua aplikasi, klien mengirim pesan yang digaungkan kembali oleh server, mengonfirmasi komunikasi lintas proses antara dua proses desktop kepercayaan penuh tanpa memerlukan konfigurasi khusus.
Registry
Penggunaan registri untuk IPC umumnya tidak dianjurkan, tetapi didukung untuk kode yang ada. Aplikasi paket hanya dapat mengakses kunci registri yang memiliki izin untuk diakses.
Aplikasi desktop yang dipaketkan (lihat Membangun paket MSIX dari kode Anda) memanfaatkan virtualisasi registri sehingga penulisan registri global dimuat ke sarang privat dalam paket MSIX. Ini memungkinkan kompatibilitas kode sumber sambil meminimalkan dampak registri global, dan dapat digunakan untuk IPC antara proses dalam paket yang sama. Jika Anda harus menggunakan registri, model ini lebih disukai dibandingkan memanipulasi registri global.
RPC
RPC dapat digunakan untuk menghubungkan aplikasi paket ke titik akhir Win32 RPC, asalkan aplikasi yang dikemas memiliki kemampuan yang benar untuk mencocokkan ACL pada titik akhir RPC.
Kemampuan kustom memungkinkan OEM dan IHV untuk menentukan kemampuan arbitrer, ACL titik akhir RPC mereka dengannya, lalu memberikan kemampuan tersebut ke aplikasi klien yang diotorisasi. Untuk aplikasi sampel lengkap, lihat sampel CustomCapability .
Titik akhir RPC juga dapat DIALOKASIKAN ke aplikasi paket tertentu untuk membatasi akses ke titik akhir hanya untuk aplikasi tersebut tanpa memerlukan overhead manajemen kemampuan kustom. Anda dapat menggunakan API DeriveAppContainerSidFromAppContainerName untuk menurunkan SID dari nama keluarga paket, lalu menerapkan ACL pada titik akhir RPC dengan SID seperti yang ditunjukkan pada sampel CustomCapability.
Memori bersama
Pemetaan file dapat digunakan untuk berbagi file atau memori antara dua proses atau lebih dengan batasan berikut:
- Secara bawaan, pemetaan file pada aplikasi yang dipaketkan hanya didukung antarproses dalam paket yang sama, kecuali proses tersebut adalah proses full trust.
- Pemetaan file dapat dibagikan antar paket sesuai dengan panduan tentang berbagi objek bernama.
Aplikasi desktop SDK Aplikasi Windows berjalan sebagai proses tepercaya penuh, sehingga dapat membuat dan menggunakan pemetaan berkas memori bersama tanpa batasan. Saat berkomunikasi dengan aplikasi paket lain yang tidak memiliki kepercayaan penuh, gunakan pendekatan ACL yang dijelaskan dalam berbagi objek bernama.
Memori bersama direkomendasikan untuk berbagi dan memanipulasi data dalam jumlah besar secara efisien.
Loopback
Loopback adalah proses berkomunikasi dengan server jaringan yang mendengarkan di localhost (alamat loopback).
Untuk menjaga keamanan dan isolasi jaringan, koneksi loopback untuk IPC diblokir secara default untuk aplikasi paket. Anda dapat mengaktifkan koneksi loopback antar aplikasi paket tepercaya menggunakan kapabilitas dan properti manifes.
- Semua aplikasi paket yang berpartisipasi dalam koneksi loopback perlu mendeklarasikan
privateNetworkClientServerkemampuan dalam manifes paket mereka. - Dua aplikasi yang dikemas dapat berkomunikasi melalui loopback dengan mendeklarasikan LoopbackAccessRules dalam manifes paket mereka.
- Setiap aplikasi harus mencantumkan yang lain dalam LoopbackAccessRules-nya. Klien mendefinisikan aturan "keluar" untuk server, dan server mendefinisikan aturan "masuk" untuk klien yang didukungnya.
Note
Nama keluarga paket yang diperlukan untuk mengidentifikasi aplikasi dalam Aturan ini dapat ditemukan melalui editor manifes paket di Visual Studio selama waktu pengembangan, melalui Pusat Mitra untuk aplikasi yang diterbitkan melalui Microsoft Store, atau melalui perintah Get-AppxPackage PowerShell untuk aplikasi yang sudah diinstal.
Aplikasi dan layanan yang tidak dikemas tidak memiliki identitas paket, sehingga tidak dapat dideklarasikan dalam LoopbackAccessRules. Anda dapat mengonfigurasi aplikasi paket untuk terhubung melalui loopback dengan aplikasi dan layanan yang tidak dikemas melalui CheckNetIsolation.exe, namun ini hanya dimungkinkan untuk skenario sideload atau penelusuran kesalahan di mana Anda memiliki akses lokal ke mesin, dan Anda memiliki hak istimewa administrator.
- Jika aplikasi paket tersambung ke aplikasi atau layanan yang tidak dikemas, jalankan
CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME>untuk menambahkan pengecualian loopback untuk aplikasi yang dikemas. - Jika aplikasi atau layanan yang tidak dikemas tersambung ke aplikasi yang dikemas, jalankan
CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME>untuk mengaktifkan aplikasi yang dikemas untuk menerima koneksi loopback masuk.- CheckNetIsolation.exe harus berjalan terus menerus saat aplikasi yang dipaket mendengarkan koneksi.
Note
Nama keluarga paket yang diperlukan untuk opsi -n pada CheckNetIsolation.exe dapat ditemukan melalui editor manifes paket di Visual Studio selama pengembangan, melalui Partner Center untuk aplikasi yang diterbitkan melalui Microsoft Store, atau melalui perintah PowerShell Get-AppxPackage untuk aplikasi yang sudah diinstal.
Memilih mekanisme IPC
Tabel berikut ini meringkas mekanisme IPC dan kasus penggunaan terbaiknya:
| Mekanisme | Paling cocok untuk | Requirements |
|---|---|---|
| Layanan aplikasi | Pertukaran data kecil dengan tas properti | Aplikasi yang dipaketkan dengan identitas paket |
| COM | Komponen yang dapat digunakan kembali, lapisan otomatisasi | Tidak ada (Win32) atau manifes paket (COM dalam paket) |
| Pipa bernama | Komunikasi dua arah berbasis aliran | Tidak tersedia untuk aplikasi dengan kepercayaan penuh |
| Memori bersama | Data besar, performa tinggi | Tidak ada untuk aplikasi kepercayaan penuh |
| RPC | Program klien/server terdistribusi | ACL harus mengizinkan akses |
| Registry | Kompatibilitas kode warisan | Tidak disarankan untuk kode baru |
| Loopback | Protokol berbasis jaringan (TCP/UDP) |
privateNetworkClientServer kemampuan untuk aplikasi terpaket |
Konten terkait
- Berbagi objek yang diberi nama
- gambaran umum SDK Aplikasi Windows
- Gambaran umum kemasan MSIX
Windows developer