进程间通信(IPC)

本主题介绍在通用 Windows 平台(UWP)应用程序和 Win32 应用程序之间执行进程间通信(IPC)的各种方法。

应用服务

应用服务使应用程序能够在后台公开接受和返回基元属性集合的服务(ValueSet)。 只要序列化,富对象就可以被传递。

应用服务可以将进程外 作为后台任务运行,也可以在前台应用程序中的进程 中运行

应用服务最适合用于共享少量数据,其中几乎不需要实时延迟。

COM

COM 是一个面向对象的分布式系统,用于创建可交互和通信的二进制软件组件。 作为开发人员,可以使用 COM 为应用程序创建可重用的软件组件和自动化层。 COM 组件可以处于进程内或进程外,并且它们可以通过 客户端和服务器 模型进行通信。 进程外 COM 服务器长期以来一直用作 对象间通信的手段。

使用 runFullTrust 功能的打包应用程序可以通过 包清单注册 IPC 进程外 COM 服务器。 这被称为 封装 COM

文件系统

BroadFileSystemAccess

打包的应用程序可以通过声明 broadFileSystemAccess 这一受限权限,使用广泛的文件系统执行 IPC。 此功能使 Windows.Storage API 和 xxxFromApp Win32 API 能够访问广泛的文件系统。

默认情况下,通过打包应用程序的文件系统的 IPC 仅限于本节中所述的其他机制。

发布者缓存文件夹

PublisherCacheFolder 使打包的应用程序能够声明其清单中的文件夹,这些文件夹可由同一发布者与其他包共享。

共享存储文件夹具有以下要求和限制:

  • 共享存储文件夹中的数据不会备份或漫游。
  • 用户可以清除共享存储文件夹的内容。
  • 不能使用共享存储文件夹在不同发布者的应用程序之间共享数据。
  • 不能使用共享存储文件夹在不同用户之间共享数据。
  • 共享存储文件夹没有版本管理。

如果发布多个应用程序,并且正在寻找在它们之间共享数据的简单机制,则 PublisherCacheFolder 是基于文件系统的简单选项。

共享访问存储管理器

SharedAccessStorageManager 与应用服务、协议激活(例如 LaunchUriForResultsAsync)等结合使用,通过令牌进行 StorageFiles 的共享。

完全信任进程启动器

使用 runFullTrust 功能,打包的应用程序可以 在同一包中启动完全信任 进程。

对于包限制构成负担的情况,或者缺少 IPC 选项,应用程序可以使用完全信任进程作为代理与系统交互,然后通过应用服务或其他受支持的 IPC 机制直接与完全信任进程进行 IPC。

LaunchUriForResultsAsync

LaunchUriForResultsAsync 用于与实现 ProtocolForResults 激活协定的其他打包应用程序进行简单(ValueSet)数据交换。 与通常在后台运行的应用服务不同,目标应用程序在前台启动。

可以通过通过 ValueSet 将 SharedStorageAccessManager 令牌传递给应用程序来共享文件。

回送

环回是指在 localhost(环回地址)上与网络服务器通信的过程。

为了保持安全性和网络隔离,默认情况下,打包的应用程序会阻止 IPC 的环回连接。 可以使用 功能和 清单属性在受信任的打包应用程序之间启用环回连接,。

注释

在开发期间,可以通过 Visual Studio 中的包清单编辑器找到规则中用于标识应用程序的包系列名称;对于通过 Microsoft 应用商店发布的应用程序, 可以通过 合作伙伴中心 获取;而对于已安装的应用程序,可以使用 Get-AppxPackage PowerShell 命令获取。

未打包的应用程序和服务没有包标识,因此无法在 LoopbackAccessRules 中声明它们。 可以将打包的应用程序配置为通过 CheckNetIsolation.exe与未打包的应用程序和服务进行环回连接,但这仅在旁加载或调试的情况下可行,此时你拥有计算机的本地访问权限,并且具有管理员权限。

  • 参与环回连接的所有打包应用程序都需要在其 包清单中声明 privateNetworkClientServer 功能
  • 如果打包的应用程序连接到未打包的应用程序或服务,请运行 CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME> 以添加打包应用程序的环回豁免。
  • 如果未打包的应用程序或服务正在连接到打包的应用程序,请运行 CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME> 以使打包的应用程序能够接收入站环回连接。
    • 在打包的应用程序侦听连接时,CheckNetIsolation.exe 必须持续运行。
    • 在 Windows 10 版本 1607(10.0;内部版本 14393)中引入了 -is 标志。

注释

-n 标志所需的包系列名称可在开发过程中通过 Visual Studio 中的包清单编辑器找到,通过 Microsoft Store 发布的应用程序,可通过 合作伙伴中心,或在已安装的应用程序中通过 Get-AppxPackage PowerShell 命令找到。

CheckNetIsolation.exe 也可用于 调试网络隔离问题

管道

管道 用于实现管道服务器与一个或多个管道客户端之间的简单通信。

匿名管道命名管道 支持以下约束:

  • 默认情况下,打包应用程序中的命名管道仅支持在同一包中的进程之间通信,除非该进程具有完全信任权限。
  • 根据 共享命名对象的准则,可以跨包共享命名管道。
  • 命名管道(在打包非打包应用中)必须在管道名称中使用语法 \\.\pipe\LOCAL\

注册表

通常不建议在 IPC 中使用 注册表,但现有代码仍支持这样的用法。 打包的应用程序只能访问其有权限访问的注册表项。

通常,打包的桌面应用(请参阅 从代码生成 MSIX 包)利用 注册表虚拟化,以便全局注册表写入包含在 MSIX 包中的专用配置单元中。 这样可以实现源代码兼容性,同时最大程度地降低全局注册表影响,并可用于同一包中的进程之间的 IPC。 如果必须使用注册表,建议优先选择此模型,而不是修改全局注册表。

RPC

RPC 可用于将打包的应用程序连接到 Win32 RPC 终结点,前提是打包的应用程序具有与 RPC 终结点上的 ACL 匹配的正确功能。

自定义功能使 OEM 和 IHV 能够 定义任意功能使用这些功能为其 RPC 终结点设置访问控制列表,然后将 这些功能授予授权客户端应用程序。 有关完整的示例应用程序,请参阅 CustomCapability 示例。

RPC 终结点可以通过 ACL 限制为仅供特定打包的应用程序访问,而不需要管理自定义功能的开销。 可以使用 DeriveAppContainerSidFromAppContainerName API 从包系列名称派生 SID,然后使用 SID 对 RPC 终结点进行 ACL,如 CustomCapability 示例中所示。

共享内存

文件映射 可用于在具有以下约束的两个或多个进程之间共享文件或内存:

  • 默认情况下,打包应用程序中的文件映射仅支持同一包内的进程之间进行,除非某个进程具有完全信任权限。
  • 可以按照 共享命名对象准则跨包共享文件映射。

建议使用共享内存来高效地共享和处理大量数据。