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的规则,文件映射可以跨封装使用。
(本篇完)