Interprocess communication (IPC)

App services

通过ValueSet来交互。ValueSet里面存的数据必须是序列化好的How to make a class that can be added to the Windows.Foundation.Collections.ValueSet

COM

经典的COM 依然可以用来创建可重用的组件,来帮助App实现自动化。和App Service一样,COM 可以同进程,也可以异进程。通过client and server 方式进行通信。一直以来,异进程的COM都被用来进行inter-object communication.

AppX要求必须有runFullTrust能力才能注册异进程COM,并且需要在应用声明中体现。这就是所谓的Packaged COM

Filesystem

BroadFileSystemAccess可以允许打包的App使用Windows.Storage以及xxxFromApp 来访问限制外的文件系统。否则不能用文件系统来做IPC 。

PublisherCacheFolder可以在同一个发布者的不同App间共享数据。但是有以下限制:

  • 此目录的数据无法自动备份和漫游
  • 用户可以手动清空该目录
  • 无法在不同发行者间使用
  • 无法在不同用户间使用
  • 此目录不具有历史版本功能

SharedAccessStorageManager可以和AppService以及protocol activations(URL激活)配合使用,来分享StorageFiles 的Tokens。

具有runFullTrust能力的App,可以在同一个包中执行 launch full trust processes

LaunchUriForResultsAsync 可以在前台通过URI加载其他APP,来进行小规模的ValueSet交换。获取的结果是ProtocolForResults 。ValueSet中可以搭载SharedStorageAccessManager 的Token来共享StorageFile。

Loopback

Loopback是和本地环回的网络服务器通信。默认情况下,打包的App无法进行环回通信。可以在App能力声明中开启环回相关的能力:

  • privateNetworkClientServer 能力需要要有
  • 两个App之间必须声明LoopbackAccessRules才能进行环回通信。作为客户端,必须定义一个请求对端App的规则;作为服务端,必须定义一个接受对端App的规则。(定义这些规则需要用到App的package family name,可以从VisualStudio的manifest editor或者通过Get-AppxPackage查看)。

未经打包封装的App没有封装僚属Id。可以通过CheckNetIsolation.exe来让封装过的App与封装过的App进行环回通信,但是这个只适用于sideload 或者调试模式(需要本地的Admin访问权限),具体如下:

  • 所有封装的App必须声明有privateNetworkClientServer 能力。
  • 如果一个封装过的App需要环回到非封装App,需要执行CheckNetIsolation.exe LoopbackExempt -a -n=来添加例外规则。
  • 反之如果一个非封装App需要环回访问封装过的App,需要执行CheckNetIsolation.exe LoopbackExempt -is -n=
    • -is标识是在Win10 1607引入的
    • CheckNetIsolation.exe 必须持续运行不能被中断

CheckNetIsolation.exe 也适合用来处理网络隔离问题

Pipes

UWP也支持经典的Pipes,包括匿名的和命名的,但是有如下限制:

  • 默认情况下,具名管道只在同一个封装下的可执行文件之间可用
  • 根据sharing named objects,具名管道可能在不同封装之间共享。
  • 具名管道必须以\\.\pipe\LOCAL\为名字

Registry

封装下的App只能访问某些受限的注册表(Registry

MSIX打包封装的App,支持注册表虚拟化registry virtualization。对全局注册表的改动将会被限制在MSIX之内,这也算是一种进程间通信的手段把。

RPC

RPC可以用来和传统的Win32 RPC端点,只要封装的App具有合适的权限,能够满足RPC的ACL。

自定义的能力(Custom capabilities)可以运行OEM和IHV来任意定义能力, define arbitrary capabilities

更多查看CustomCapability

Shared Memory

文件映射可以用来在多个进程分享文件或者内存,但是具有以下限制:

  • 默认情况下,文件映射只能用于同一封装下的进程
  • 遵循sharing named objects的规则,文件映射可以跨封装使用。

(本篇完)