İşlemler arası iletişim (IPC)

Bu konuda, Windows Uygulama SDK'sı masaüstü uygulamaları ve diğer Win32 uygulamaları arasında işlemler arası iletişim (IPC) gerçekleştirmenin çeşitli yolları açıklanmaktadır. Windows Uygulama SDK'sı masaüstü uygulamaları tam güvenilir Win32 işlemleri olarak çalıştığından, tüm işletim sistemi düzeyindeki IPC mekanizmalarına doğrudan erişime sahiptirler. Uygulamalar MSIX ile paketlendiğinde, aşağıdaki bölümlerde belirtildiği gibi bazı mekanizmaların ek gereksinimleri vardır.

Uygulama hizmetleri

Uygulama hizmetleri, uygulamaların arka planda temel öğeleri (ValueSet) içeren özellik torbalarını kabul eden ve döndüren hizmetleri kullanıma sunmasını sağlar. Zengin nesneler, serileştirildikleri takdirde aktarılabilir.

Uygulama hizmetleri işlem dışı bir arka plan görevi olarak veya ön plan uygulamasında işlem halinde çalışabilir.

Note

Uygulama hizmetleri, paket kimliğine sahip paketlenmiş bir uygulama gerektirir. MSIX paketleme kullanan Windows Uygulama SDK'sı uygulamalarda kullanılabilir.

Uygulama hizmetleri, neredeyse gerçek zamanlı gecikme süresinin gerekli olmadığı küçük miktarlardaki verileri paylaşmak için en iyi şekilde kullanılır.

COM

COM , etkileşim kurabilen ve iletişim kurabilen ikili yazılım bileşenleri oluşturmaya yönelik dağıtılmış nesne odaklı bir sistemdir. Geliştirici olarak, bir uygulama için yeniden kullanılabilir yazılım bileşenleri ve otomasyon katmanları oluşturmak için COM kullanırsınız. COM bileşenleri işlem aşamasında veya işlem dışı olabilir ve bir istemci ve sunucu modeli aracılığıyla iletişim kurabilir. İşlem dışı COM sunucuları uzun zamandır nesneler arası iletişim için bir araç olarak kullanılmıştır.

özelliğine runFullTrust sahip paketlenmiş uygulamalar, paket bildirimi aracılığıyla IPC için işlem dışı COM sunucularını kaydedebilir. Bu, Paketlenmiş COM olarak bilinir.

Windows Uygulama SDK'sı masaüstü uygulamaları tam güven işlemleri olarak çalıştırıldığından, geleneksel Win32 uygulamaları gibi com sunucularını doğrudan Windows Kayıt Defteri üzerinden kaydedebilir ve kullanabilirler.

Filesystem

BroadFileSystemAccess

Paketlenmiş uygulamalar, broadFileSystemAccess kısıtlı yeteneğini bildirerek geniş dosya sistemi üzerinden IPC gerçekleştirebilir. Bu özellik, Windows.Storage API'lerine ve Win32 FromApp API'lerine dosya sisteminin geniş kapsamına erişim sağlar.

Varsayılan olarak, paketlenmiş uygulamalar için dosya sistemi aracılığıyla IPC, bu bölümde açıklanan diğer mekanizmalarla sınırlıdır.

PublisherCacheFolder

PublisherCacheFolder, paketlenmiş uygulamaların kendi bildirimlerinde aynı yayımcı tarafından diğer paketlerle paylaşılabilen klasörleri bildirmesine olanak tanır.

Paylaşılan depolama klasörü aşağıdaki gereksinimlere ve kısıtlamalara sahiptir:

  • Paylaşılan depolama klasöründeki veriler yedeklenmez veya dolaşıma alınmaz.
  • Kullanıcı paylaşılan depolama klasörünün içeriğini temizleyebilir.
  • Farklı yayımcıların uygulamaları arasında veri paylaşmak için paylaşılan depolama klasörünü kullanamazsınız.
  • Verileri farklı kullanıcılar arasında paylaşmak için paylaşılan depolama klasörünü kullanamazsınız.
  • Paylaşılan depolama klasörünün sürüm yönetimi yoktur.

Birden çok uygulama yayımlıyorsanız ve bunlar arasında veri paylaşmak için basit bir mekanizma arıyorsanız PublisherCacheFolder basit bir dosya sistemi tabanlı seçenektir.

Boru

Kanallar , bir kanal sunucusu ile bir veya daha fazla kanal istemcisi arasında basit iletişim sağlar.

Anonim kanallar ve adlandırılmış kanallar aşağıdaki kısıtlamalarla desteklenir:

  • Varsayılan olarak, paketlenmiş uygulamalardaki adlandırılmış kanallar, bir işlem tam güvene sahip olmadığı sürece, yalnızca aynı paket içindeki işlemler arasında desteklenir.
  • Adlandırılmış kanallar, adlandırılmış nesneleri paylaşma yönergelerine uyularak paketler arasında paylaşılabilir.
  • Paketlenmiş uygulamalardaki adlandırılmış kanalların adında LOCAL\ bulunmalıdır (örneğin, \\.\pipe\LOCAL\<pipename>). LOCAL\ segmenti, pipe'ı çağıranın oturum açma oturumuyla sınırlandırır ve MSIX paketli uygulamalar için gereklidir. gibi NamedPipeServerStream.NET API'leri kullanırken yalnızca LOCAL\<pipename> bölümünü geçirin; \\.\pipe\ ön ek dahili olarak işlenir.

Windows Uygulama SDK'sı masaüstü uygulamaları tam güven işlemleri olarak çalışır, böylece aynı paket kısıtlaması olmadan adlandırılmış kanallar oluşturabilir ve kullanabilirler. Ancak, tam güveni olmayan başka bir paketlenmiş uygulamayla iletişim kuruyorsanız yukarıdaki kısıtlamalar geçerli olmaya devam eder.

Adlandırılmış kanal örneği (C#)

Aşağıdaki örnekte tam adlandırılmış kanal sunucusu ve istemcisi iki konsol uygulaması olarak gösterilmiştir. Windows Uygulama SDK'sı masaüstü uygulamaları tam güven düzeyinde çalışan işlemler olduğundan, adlandırılmış kanal üzerinden IPC herhangi bir özel özellik veya bildirim dosyası girdisi gerektirmeden çalışır.

Bu örneği denemek için iki konsol uygulaması projesi oluşturun (ImplicitUsings etkinleştirilmiş olarak net8.0-windows hedeflenerek) ve önce sunucuyu, ardından istemciyi ayrı bir terminalde çalıştırın.

Kanal sunucusu — adlandırılmış bir kanal oluşturur ve iletileri istemciye geri yankılar:

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.");

Pipe istemcisi — sunucuya bağlanır ve kullanıcı girdisini gönderir:

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.");

Her iki uygulamayı da çalıştırdığınızda istemci, sunucunun geri yankıladığı iletileri gönderir; bu da herhangi bir özel yapılandırma gerektirmeden iki tam güvenilir masaüstü işlemi arasındaki işlemler arası iletişimi doğrular.

Registry

IPC için kayıt defteri kullanımı genellikle önerilmez, ancak mevcut kod için desteklenir. Paketlenmiş uygulamalar yalnızca erişim iznine sahip oldukları kayıt defteri anahtarlarına erişebilir.

Paketlenmiş masaüstü uygulamaları (bkz. Kodunuzdan MSIX paketi oluşturma) genel kayıt defteri yazma işlemleri MSIX paketindeki özel bir kovana dahil olacak şekilde kayıt defteri sanallaştırmasından yararlanır. Bu, genel kayıt defteri etkisini en aza indirirken kaynak kodu uyumluluğunu etkinleştirir ve aynı paketteki işlemler arasında IPC için kullanılabilir. Kayıt defterini kullanmanız gerekiyorsa, genel kayıt defterini düzenlemek yerine bu model tercih edilir.

RPC

Paketlenmiş uygulamanın RPC uç noktasındaki ACL'lerle eşleşecek doğru özelliklere sahip olması koşuluyla, RPC paketlenmiş bir uygulamayı Win32 RPC uç noktasına bağlamak için kullanılabilir.

Özel özellikler, OEM'lerin ve IHV'lerin rastgele yetenekler tanımlamasına, rpc uç noktalarını bunlarla birlikte ACL'ye ve ardından yetkili istemci uygulamalarına bu özellikleri vermesine olanak tanır. Tam örnek uygulama için bkz. CustomCapability örneği.

RPC uç noktaları, özel özelliklerin yönetim ek yüküne gerek kalmadan uç noktaya erişimi yalnızca bu uygulamalarla sınırlandırmak için belirli paketlenmiş uygulamalara acledilebilir. DeriveAppContainerSidFromAppContainerName API'sini kullanarak bir paket ailesi adından SID türetebilir ve ardından CustomCapability örneğinde gösterildiği gibi SID ile RPC uç noktasını ACL'sini kullanabilirsiniz.

Paylaşılan bellek

Dosya eşleme , aşağıdaki kısıtlamalarla iki veya daha fazla işlem arasında dosya veya bellek paylaşmak için kullanılabilir:

  • Varsayılan olarak, paketlenmiş uygulamalarda dosya eşlemeleri, bir işlem tam güvene sahip değilse yalnızca aynı paket içindeki işlemler arasında desteklenir.
  • Dosya eşlemeleri , adlandırılmış nesneleri paylaşma yönergelerini izleyerek paketler arasında paylaşılabilir.

Windows Uygulama SDK'sı masaüstü uygulamaları tam güven işlemleri olarak çalışır, böylece kısıtlama olmadan paylaşılan bellek dosyası eşlemeleri oluşturabilir ve kullanabilirler. Tam güveni olmayan başka bir paketlenmiş uygulamayla iletişim kurarken, adlandırılmış nesneleri paylaşma konusunda açıklanan ACL yaklaşımını kullanın.

Paylaşılan bellek, büyük miktarda veriyi verimli bir şekilde paylaşmak ve işlemek için önerilir.

Loopback

Geri döngü, localhost'ta (geri döngü adresi) dinleyen bir ağ sunucusuyla iletişim kurma işlemidir.

Güvenlik ve ağ yalıtımını korumak için, paketlenmiş uygulamalarda IPC için geri döngü bağlantıları varsayılan olarak engellenir. Yetenekleri ve bildirim dosyası özelliklerini kullanarak güvenilen paketlenmiş uygulamalar arasında geri döngü bağlantılarını etkinleştirebilirsiniz.

  • Geri döngü bağlantılarına katılan tüm paketlenmiş uygulamaların privateNetworkClientServer gerekir.
  • paketlenmiş iki uygulama, paket bildirimleri içinde LoopbackAccessRules bildirerek geri döngü yoluyla iletişim kurabilir.
    • Her uygulamanın diğerini LoopbackAccessRules içinde listelemesi gerekir. İstemci, sunucu için bir "out" Kuralı tanımlar ve sunucu, desteklediği istemciler için "in" Kuralları tanımlar.

Note

Bu Kurallarda bir uygulamayı tanımlamak için gereken paket ailesi adı, geliştirme sırasında Visual Studio paket bildirimi düzenleyicisi, Microsoft Store aracılığıyla yayımlanan uygulamalar için İş Ortağı Merkezi veya önceden yüklenmiş uygulamalar için Get-AppxPackage PowerShell komutu aracılığıyla bulunabilir.

Paketlenmemiş uygulama ve hizmetlerin paket kimliği olmadığından, Bunlar LoopbackAccessRules içinde bildirilemez. Paketlenmiş bir uygulamayı CheckNetIsolation.exearacılığıyla paketlenmemiş uygulama ve hizmetlerle geri döngü yoluyla bağlanacak şekilde yapılandırabilirsiniz, ancak bu yalnızca makineye yerel erişiminiz olan ve yönetici ayrıcalıklarına sahip olduğunuz dışarıdan yükleme veya hata ayıklama senaryoları için mümkündür.

  • Paketlenmiş bir uygulama paketlenmemiş bir uygulama veya hizmete bağlanıyorsa, paketlenmiş uygulama için geri döngü muafiyeti eklemek için komutunu çalıştırın CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME> .
  • Paketlenmemiş bir uygulama veya hizmet paketlenmiş bir uygulamaya bağlanıyorsa, paketlenmiş uygulamanın gelen geri döngü bağlantılarını almasını sağlamak için komutunu çalıştırın CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME> .
    • CheckNetIsolation.exe paketlenmiş uygulama bağlantıları dinlerken sürekli çalışıyor olmalıdır.

Note

-n bayrağı için gereken paket ailesi adı, geliştirme sırasında Visual Studio paket bildirimi düzenleyicisi, Microsoft Store aracılığıyla yayımlanan uygulamalar için İş Ortağı Merkezi veya önceden yüklenmiş uygulamalar için Get-AppxPackage PowerShell komutu aracılığıyla bulunabilir.

IPC mekanizması seçme

Aşağıdaki tabloda IPC mekanizmaları ve bunların en iyi kullanım örnekleri özetlemektedir:

Mekanizma En iyi kullanım alanları Requirements
Uygulama hizmetleri Tesis torbaları ile küçük veri alışverişi Paket kimliğine sahip paketlenmiş uygulama
COM Yeniden kullanılabilir bileşenler, otomasyon katmanları Yok (Win32) veya paket bildirgesi (Paketli COM)
Adlandırılmış kanallar Akış tabanlı çift yönlü iletişim Tam güven uygulamaları için yok
Paylaşılan bellek Büyük veri, yüksek performans Tam güven uygulamaları için yok
RPC Dağıtılmış istemci/sunucu programları ACL'lerin erişime izin vermesi gerekir
Registry Eski kod uyumluluğu Yeni kodda kullanılması önerilmez
Loopback Ağ tabanlı protokoller (TCP/UDP) privateNetworkClientServer paketlenmiş uygulamalar desteği