Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

23 Jun 2021

Project Reunion文档阅读笔记【一】

Project Reunion

Build desktop Windows apps with Project Reunion

Project Reunion提供了开发组件和工具用于Windows应用开发。Project Reunion还提供了统一化的API和工具方便开发适用于不同Windows 10版本的桌面App。

Project Reunion并不是为了替换当前的桌面App开发方式,比如WPF, Windows Forms以及Win32,而是为了提供一套补充性的公共的API和工具。

Get started with Project Reunion

Project Reunion提供了VS扩展,其中包括了VS的项目模板。另外还提供了NuGet软件包,用于安装相关的程序库。

本章节还提供了一些链接,可以帮助快速上手。

Benefits of Project Reunion for Windows developers

Project Reunion所提供的API是独立于OS的,并按照NuGet软件包的形式提供。这不意味着Project Reunion会替代Windows SDK。

Unified API surface across desktop app platforms

为不同桌面APP开发方式提供统一的平台API访问方式。

Project Reunion提供WinRT API,以及传统的C API。

Consistent support across Windows 10 versions

Project Reunion对平台的不一致性提提供一层保证。从1809开始的Windows 10都被支持。这样应用本身不同对不同版本的OS做适配。

Faster release cadence

OS的发布周期一般是一年一次或者两次。Project Reunion则可以更频繁。

Developer roadmap

Project Reunion Roadmap

目前对UWP的支持还是处于预览状态。

Give feedback and contribute

Manage resources with MRT Core

MRT Core是Resource Management System 的畅爽版。MRT Core包含构建时以及运行时的功能。构建时系统创建一个关于资源所有变体的索引,叫做Package Resource Index,简称PRI,这个索引会放置到App软件包中。

Win32 MRT Core

Package Resource Index (PRI) file

每个软件包中必须含有一个二进制形式的资源索引库,其中包含多个资源索引,每个索引都是一张资源映射图。

PRI文件含有确实的字符串资源。内嵌的二进制以及文件路径资源是直接从项目文件索引而来的。一个软件包对于每种语言来说通常包含一个资源索引,以resources.pri命名。当ResourceManager 对象例现化的适合,软件包顶层的resoruces.pri会被自动加载。

PRI文件只包含数据,所以不使用PE(portable executable)格式,而是一个针对数据特别设计的格式。

Project Reunion 0.5 需要对字符串和图片进行额外配置

  • 字符串,确保.resw的构建行为设置成PRIResource
  • 影像文件,确保其构建行为设置成Content。把影像文件添加到Assets目录的时候会自动设置此构建行为。

Access app resources with MRT Core

MRT Core提供了若干种访问App资源的方式。

Basic functionality with ResourceLoader

ResourceLoader 提供基本的对字符串资源的访问。访问目标可以是资源文件,引用的程序库,以及其他软件包。

Advanced functionality with ResourceManager

ResourceManager 提供资源相关的额外信息,比如对资源的列举以及检视。

ResourceCandidate 表示单个具体资源以及其修饰量,比如"Hello World"是英文文本,“logo.scale-100.jpg"是具有scale-100解析度的图像。

资源是以层次结构组织的合集,可以通过ResourceMap 访问。ResourceManager.MainResourceMap是主映射表(不包含引用的框架软件包)。每个ResourceMap内部是一颗子树(ResourceMap.GetSubtree))。子树可以对应到包含该资源的资源文件。

ResourceManager还可以列举和检视格式文件资源。文件资源路径形如’Files/images/logo.png’。

Qualify resource selection with ResourceContext

资源的选取根据的是当前的ResourceContext,其包含资源规格,比如语言、缩放、对比度等等。默认上下文中的每个规格使用的都是App的当前值,但是这是可以被覆盖的。获取资源的时候提供适合的ResourceContext可以帮助选取最合适的资源。

Sample

一个样例

Render text with DWriteCore

DWriteCore是DirectX API中的DirectWrite的实现,用于高质量文本渲染,分辨率无关的字体,以及完整的Unicode文本和布局支持。

DWriteCore提供了所有DirectWrite跟文本渲染相关的特性,包括设备无关的文本布局系统,硬件加速渲染,多格式文本,以及宽体语言支持。更多查看DWriteCore overview

App instancing in AppLifecycle

Single-instance apps

单实例的应用一次只有一个主进程在运行。尝试加载第二个实例,只会第一个实例的主窗口。这仅是针对主进程而言,单实例应用可以有多个后台进程。

UWP应用默认是单实例的。但是也可以变成多实例的。可以在加载的时候决定创建额外的实例还是使用既有实例。

Windows 10 Mail应用是一个单实例应用的很好的例子。首次加载Mail会创建一个实例,后发的加载会激活第一个实例,而不是创建新实例。

Multi-instanced apps

多实例应用的主进程可以被创建多次。每次加载此应用的时候都会创建一个新的主窗口。

传统上,非打包的应用默认是多实例的,需要额外的实现才能变成单实例。通常采用的是具名互斥量来判定应用是否已在运行。

How Project Reunion instancing differs from UWP instancing

Project Reunion基于UWP的模型,但是有一些差别:

  • AppInstance class
    • UWP:AppInstance着重于实例重定向场景
    • Project Reunion: 除了UWP功能外,还会有新的扩展
  • List of Instances
    • UWP:GetInstances只返回显示注册过的重定向
    • Project Reunion: 返回所有运行的实例,包括当前的。不同版本,不同用户加载的实例会归属到不同列表

Registering Keys

多实例应用的每个实例可以通过FindOrRegisterForKey 来注册一个键值。具体使用方式供应用自己决定。

实例可以在任意时候更新该键值。但是,如果键值被其他实例设置过了,就不能再重复设置,否则FindOrRegisterForKey会返回具有所指键值的实例。

  • UWP:应用必须注册一个键值,这样此应用才会出现在GetInstances结果中
  • Project Reunion: 是否注册键值与GetInstances结果无关。

Unregistering keys

  • UWP:注销后无法重定向,以及不会包含在GetInstances列表中
  • Project Reunion:无影响

Instance Redirection Targets

应用的多个实例可以互相激活,也就是所谓的重定向激活。当一个实例被重定向到的时候,其Activated回调会被执行。

  • UWP:只有注册有键值的实例才会被重定向到
  • Project Reunion:与是否有键值无关

Post-Redirection Behavior

  • UWP:重定向到别的实例会导致当前实例退出
  • Project Reunion:非也。

激活请求可以被多次重定向。实例A可以重定向给实例B,然后给实例C。应用必须自己防止循环重定向。

Activation Events

为了处理重定向请求,应用需要处理Activated事件

  • UWP:该事件的参数是IActivatedEventArgs
  • Project Reunion:该事件参数是Microsoft.Windows.AppLifecycle.AppActivationArguments

Examples

相关场景的示例代码

Rich activation in AppLifecycle

AppLifecycle处于预览状态

Project Reunion将UWP风格的多方位激活方式散播给其他类型的应用,不管应用是否打包。

https://docs.microsoft.com/en-us/windows/uwp/api/Windows.ApplicationModel.Activation.ActivationKind

支持多方位激活需要两步:

  • 告诉系统你的应用支持多方位激活
  • 应用激活时处理具体传入的载荷

Activation details for unpackaged apps

为非打包的应用提供了四种通用激活类别:

  • Launch,常见的激活方式
  • File,从关联文件激活
  • Protocol,从注册的协议激活,比如通过ShellExecute, LaunchUriAsync, 或者命令行
  • StartupTask,随系统启动激活,可能是通过注册表或者启动目录

不同类型的应用接受参数的方式不一样,Win32应用的参数是通过WinMain的输入参数提供的;WinForms应用则是通过Environment.GetCommandLineArgs。

Activation details for packaged apps

打包的应用支持44中UWP的激活类别,激活会触发Activation事件。通过AppInstance.GetActivatedEventArgs可以获取激活参数。

Activation registration

所有应用默认支持Launch激活。和UWP不同,Project Reunion对于Launch还提供从命令行激活。应用可以通过以下方式注册额外的激活类别:

  • 所有应用都可通过AppLifecycle来注册和注销激活类别
  • 非打包应该可以通过修改注册表键值来注册额外的激活方式
  • 打包应用可以在应用申报中填写额外的注册方式

Examples

一些例子

Deploy apps that use Project Reunion

中包含一些有趣的主题

(本篇完)

2021-06-26更新

使用Project Reunion 0.8带的项目文件创建的WinUI Destkop的项目会含有两个子项目,一个以(Package)结尾,另一个以(Desktop)结尾。好像不能直接对(Desktop)结尾的项目进行调试。

(更新完)