2018 年 1 月

第 33 卷,第 1 期

通用 Windows 平台 - .NET UWP 开发有哪些新变化?

作者 Daniel Jacobson | 2018 年 1 月

早在 2015 年 10 月,我们其中一人有幸撰写了一篇 有关 .NET 通用 Windows 平台 (UWP) 开发的文章 (msdn.com/magazine/mt590967)。从那以后,.NET UWP 开发有许多变化。我们希望通过一篇新文章来介绍这些变化,以帮助开发人员及时获悉最新动态。

自 2015 年 10 月起,Microsoft 发布了新版 Visual Studio 2017、多个新版 SDK(包括最新的 Windows 10 Fall Creators Update SDK)、Windows 应用打包项目、.NET Standard 2.0 支持、NuGet 改进、新版 Fluent 设计系统、新版社区驱动工具(包括 Windows Template Studio)等。这些 UWP 开发人员生态系统的更改和改进大多旨在简化现有 .NET 资产的迁移操作、优化 Windows 10 上的应用部署策略和加速 UWP 开发,以便用户能够尽可能快速地生成优质应用。

借助为 Windows 10 Fall Creators Update SDK (10.0.16299.0) 提供最佳支持的 Visual Studio 2017 版本 15.5 及更高版本,Windows 10 Fall Creators Update 为 UWP 开发人员提供了许多改进。最重要的前几项更改包括企业应用的新增功能、简化了应用部署,以及支持 .NET Standard 2.0 和新 Fluent 设计系统。接下来,将探索这些革新。

Windows 中企业应用的新增功能

Microsoft 认识到,需要改进 Windows 10 平台,以方便企业开发人员生成在桌面 PC 上运行的 Windows 应用,并且已在这方面取得了重要进步,即推出了 Windows 10 Fall Creators Update。

充分利用 UWP 和 Win32:Microsoft 已改进 Windows 10 平台,推出了桌面桥 (aka.ms/desktopbridge),以增加对所有 .NET 开发人员的吸引力,无论他们当前关注的是 UWP、Windows Presentation Foundation (WPF)、Windows 窗体还是 Xamarin。通过 Visual Studio 2017 版本 15.5 中新增的“应用打包项目”项目类型,可以为 WPF 或 Windows 窗体项目创建 Windows 应用包,就像可以为 UWP 项目创建一样。

打包应用后,便可以受益于所有 Windows 10 应用部署优势,包括能够通过 Microsoft Store(对于使用者应用)、适用于企业和教育的 Microsoft Store 或任何常用应用部署选项(如 Intune)进行分发。由于打包的应用有权在桌面上访问整个 UWP API 图面和 Win32 API,因此可以使用 UWP API 和 Windows 10 功能逐渐现代化 WPF 和 Windows 窗体应用。还可以在 UWP 应用中添加 Win32 组件,这样应用就能在桌面上启用所有 Win32 功能。

安心无忧:用户可以安装应用,既不会有遗憾,也不用担心应用中有恶意软件。无需管理员权限即可安装,每个应用都是与其他应用分开安装,这样可以简化管理。卸载保证一定是干净卸载,既不会逐步降低注册表或文件系统的性能,也不会出现安装软件带来的其他意外副作用。现在,这种分发方式还适用于使用 Windows 应用打包项目的 WPF 和 Windows 窗体应用。

面向企业的安全性:Windows Hello 对设备和兼容应用启用生物识别身份验证。Windows 10 应用模型通过 UWP 应用容器保护数据和系统健康。借助这些容器,用户可以控制应用能够和不能执行的操作。此外,应用还必须公开资源(如位置或麦克风)的使用情况,这些由用户或 IT 管理员通过隐私设置进行控制。

缩小桌面应用的差距:最新版 Fall Creators Update 已帮助缩小了 UWP 和 Win32 桌面应用之间的 API 和功能差距。.NET Standard 2.0 支持不仅显著扩大了可用 API 图面,并提供了对许多重要 NuGet 包(之前无法在 UWP 项目中使用)的访问权限。例如,企业开发人员最终有权访问 SqlClient API,在 UWP 项目中直接与 SQL Server 数据库进行通信。Microsoft 还会继续改进适用于桌面和企业方案的 UWP 应用模型。最新更新支持命令行激活、自动启动和运行完全信任应用或无限制执行生存期(extendedBackgroundTaskTime 和 extendedExecutionUnconstrained)应用。

简化了应用部署

Microsoft 认识到,许多 .NET 开发人员仍在生成 Windows 窗体和 WPF 应用。除了尽可能简化现有资产的迁移操作外,本公司还致力于解决如今许多开发人员都要面对的问题,即部署。使用 Visual Studio 2017,利用桌面桥 (aka.ms/desktopbridge) 打包现有 Win32 .NET 应用可以比以往更容易。

当然可以使用 Windows 应用打包项目向 Microsoft Store 提交 Win32 应用,但还有其他许多方法可用于将应用打包为 .appx。这些选项可以满足许多组织对部署灵活性的需求。

自 Windows 10 Fall Creators Update 起,可以在 Web 上托管自己的 .appx 安装程序,从而自动调用应用安装程序。此操作非常简单,只需向 Web 上的 .appx 链接添加激活方案 (ms-appinstaller:?source=) 即可。有关详细信息,请查看有关直接 Web 安装的博客文章 (bit.ly/2mJfIUI)。使用这种方法,真的很容易在组织内共享应用。例如,只需在网站上发布 .appx 链接即可。

还可以创建应用安装程序清单来支持自动包更新。此应用安装程序技术优于 ClickOnce 等方案的地方在于,应用在后台自动更新,甚至可以在用户启动它之前就更新。若要了解如何创建自定义 .appinstaller 文件,以用于私有托管部署通道中的自动应用更新,请查看 bit.ly/2z4Fx3A 上的博客文章。

如果组织需要功能更强大的设备管理工具,可以通过 Microsoft Intune (bit.ly/2B7OnyR) 利用和分发应用。Windows 应用打包项目是最快速的路由,可便于通过 Microsoft Intune 轻松托管应用。

最后还有重要的一点,可以通过 Visual Studio App Center (bit.ly/2AKpsjJ) 分发应用。使用 Visual Studio App Center,可以将应用快速部署到应用的开发团队或 beta 版本测试人员。还可以轻松启用分析功能,从而确定谁在如何使用应用。

借助 Windows 应用打包项目和众多的 .appx 包分发通道,可以轻松打包和分发适用于组织中任意方案的应用。

.NET Standard 2.0 支持

Windows 10 Fall Creators Update 是首版支持 .NET Standard 2.0 的 Windows 10。如果不熟悉 .NET Standard,可以访问 aka.ms/dotnetstandard 了解详细信息。实际上,.NET Standard 是任何 .NET 平台都可以实现的基类库的引用实现,无论是 .NET Framework、.NET Core 还是 Xamarin。.NET Standard 旨在尽可能方便 .NET 开发人员跨选用的任意 .NET 平台共享代码。

虽然与可移植类库 (PCL) 模型有一些相似之处,但 .NET Standard 的最大不同之处在于,不需要选择目标平台。如果目标平台实现标准定义的基类库,共享代码便会生效。与 PCL 相比,.NET Standard 的一项巨大优势在于,如果引入支持 .NET Standard 的新 .NET 平台,无需修改共享代码库,因为不用添加任何新目标平台。 

虽然早期迭代的 .NET Standard(版本 1.x)是一个良好开始,但通过 Windows 10 Fall Creators Update 和 .NET Standard 2.0,Microsoft 大大简化了跨 .NET 平台共享代码的操作。与任何 1.x 版相比,.NET Standard 2.0 都新增了约 20,000 个 API。此外,.NET Standard 2.0 还支持 .NET Framework 版本 4.6.1,并支持开发人员执行定目标到 Windows 10 Fall Creators Update 的 UWP 开发。将在“.NET 和 UWP 开发”部分中介绍有关具体工作原理的各种细节。

.NET Standard 2.0 的另一项巨大优势在于,支持迁移现有 .NET 应用(无论是 WPF 应用,还是 Windows 窗体应用)。如果 .NET 应用定目标到 .NET Framework 4.6.1 或更高版本,可以开始将代码隐藏类移植到 .NET Standard 2.0 库中。然后,可以跨任何实现 .NET Standard 2.0 的 .NET 平台共享相同的代码。图 1 中的 .NET Standard 兼容性矩阵展示了各版本的支持情况。

.NET Standard 兼容性矩阵
图 1:.NET Standard 兼容性矩阵

也就是说,可以开始将代码移植到可重用库中。准备就绪后,便可以在 UWP 应用、Xamarin 应用、.NET Core 应用等中共享相同的代码。

为了有助于确定代码是否与 .NET Standard 2.0 在 API 一级兼容,Microsoft 创建了可移植性分析器,用于生成报告,指明哪些 API 与各个 .NET 实现相兼容 (bit.ly/2zlgrBz)。还可以观看有关 .NET Conf 2017 的实用 Channel9 视频 (bit.ly/2j9TB52),其中分步介绍了从 Windows 窗体 .NET 应用移植到 UWP 应用的整个过程。

Fluent 设计系统

随着计算设备的演变和混合现实的出现,Windows 设计系统的发展也很至关重要。为了应对这种转变,Microsoft 发布了 Fluent 设计系统 (fluent.microsoft.com)。此系统是在五个构建基块概念(亮度、深度、运动、材料和缩放)基础之上构建而成,旨在支持新一代跨设备类型用户体验。

通过 Windows 10 Fall Creators Update,已经可以发现 Fluent 项目正在影响 Windows 10 和应用开发。了解 Fluent 设计的实际效果的绝佳方式是,查看 GitHub 上 UWP 示例中的 XAMLUIBasics 示例 (bit.ly/2mK4pvH)。

还可以查看 aka.ms/eshopuwp/src 中的另一个示例(如图 2 所示),它展示了更侧重企业的方案中的 Fluent 设计原则。在此示例中,可以看到在导航窗格中提供复合层的丙烯画材料。还可以看到用于突出显示“添加新项目”导航按钮的亮度效果。

Fluent 设计的实际效果
图 2:Fluent 设计的实际效果

Visual Studio 2017 改进

与 Visual Studio 2015 相比,Visual Studio 2017 有许多改进。随后将突出强调 IDE 的一些最重要且最有影响力的新功能。

接下来,将从最新工具(即 Visual Studio 2017)开始。Visual Studio 2017 的核心优先事项之一是,尽可能加快和简化安装。只要开始安装 Visual Studio 2017,便会立即认识到优于 Visual Studio 2015 的改进之处。

安装从 Visual Studio 安装程序(见图 3)开始,可便于用户管理 Visual Studio 2017 的所有安装。它引入了旨在提供开发人员完成作业所需内容的工作负载,支持方案驱动的数据采集。工作负载做到了这一点,这样用户只会安装需要的内容,而不会安装任何多余内容(这经常会导致 Visual Studio 2015 安装时间变长)。此外,还可以并行安装 Visual Studio 2017 实例,这样就能在同一台计算机上安装预览版 (visualstudio.com/vs/preview) 和零售版 (visualstudio.com) 了。这样一来,既可以试用最新、最棒的功能,又不会影响生产环境。

Visual Studio 安装程序
图 3:Visual Studio 安装程序

此外,自 Windows 10 Creators Update (10.0.15063.0) 起,也可以并行设置 SDK 安装。现在,可以在 Windows 预览体验成员计划 (insider.windows.com) 中注册并试用预览版 SDK,同样也不会破坏生产环境。

XAML 设计器改进

Visual Studio 2017 版本 15.4 引入了一些重大的 XAML 设计器更新。这些更新以多项设计注意事项为核心,具体包括:

  • 大大提升了设计器性能
  • 高保真设计器图面,特别注重呈现新 Windows Fluent 设计系统引入的项目
  • 减少了设计器异常,以最大限度地降低对用户的干扰,并最大限度地提高开发人员的设计图面工作效率
  • 改进了设计器用户体验,未破坏或更改 Visual Studio 和 Blend 中的现有 XAML 开发
  • 更新了工具,有助于最大限度地提高 Windows 体验开发人员的工作效率。

这些设计器更新要求我们重新审视设计器的基础体系结构。在短期内对 Windows 开发人员造成的影响是,Microsoft 必须重新生成开发人员已熟悉的大部分工具。为了应对这一挑战,Microsoft 仅向定目标到 Windows 10 Fall Creators Update (10.0.16299.0) 或更高版本的 UWP 开发人员发布了 XAML 设计器更新。若要更详细地了解这些更新,可以访问 aka.ms/uwpsiblog

Windows 应用打包项目

为了简化 Windows 10 应用部署,现在可以新建“Windows 应用打包项目”项目类型。借助此项目,可以添加对 Win32 应用(例如,Windows 窗体应用和 WPF 应用)的引用,并使用 .appx 包格式打包应用。

此项目的使用非常简单。只需向解决方案添加新的 Windows 应用打包项目,并使用“应用”节点添加对 Win32 应用的引用,如图 4 所示。

WapProj 演示
图 4:WapProj 演示

若要创建包,请右键单击“Windows 应用打包项目”,再依次选择“存储 | 创建应用包”。输出为 .appx,可以使用本文中“简化了应用部署”部分提及的任何一种方法进行部署。

NuGet 改进

通过 Visual Studio 2017,所有 .NET UWP 应用都可以利用 NuGet 包引用模型向项目添加 NuGet 包 (bit.ly/2AXDDlz)。NuGet 包引用为 NuGet 包创建者和 NuGet 包使用者提供了多项优势。

PackageReference 包含直接 MSBuild 集成,支持跨多个项目管理包等新方案。举个例子。假设所就职的企业有一个核心库,此库跨企业生成的所有(或许多)项目进行共享。习惯上,如果库有更新,所有使用相应包的项目都需要更新引用,才能利用最新版。使用 PackageReference,企业可以创建共享 MSBuild 目标,并将它导入每个项目中。如果核心库有更新,可以在自定义 MSBuild 目标中更新版本。此时,所有其中导入了 MSBuild 目标的项目都会引用更新版核心库,而无需更新每个项目。

此外,MSBuild 集成还启用条件包引用,这样可以更精密地控制项目依赖关系。同样在上例中,现在生成的是调试版和发布版核心库。共享 MSBuild 目标可以指定条件包依赖关系,以便在使用库的项目的调试内部版本中使用调试版库。这样,可以生成未优化版库,以提供最佳调试体验。生成项目的发布版本时,可以将条件依赖关系配置为切换到发布版核心库。

最后,对于 NuGet 包创建者,可以在一个 NuGet 包中利用平台多目标。平台多目标的一个精彩用例是,发布一个 NuGet 包以支持所有 .NET 平台。假设之前在 NuGet 上生成并托管 .NET Framework 库,并希望将它更新为支持 .NET Standard 2.0。最新版 NuGet 包可以同时维持两个实现,以便最新版包始终适用,无论使用包的项目是哪个。例如,若有 .NET Framework 4.5 实现和 .NET Standard 2.0 实现,任何定目标到 .NET Framework 4.5 或更高版本或实现 .NET Standard 2.0 的 .NET 应用都可以使用 NuGet 包。对于 UWP 开发,指定的平台与项目的 TargetPlatformMinVersion 关联。如果 TargetPlatformMinVersion 大于等于 NuGet 包中指定的平台,可以在项目中引用 NuGet 包。

在 Visual Studio 2015 中,Visual Studio 随附 .NET Native 编译器。尽管用于 UWP 开发的 .NET Core 实现以一组 NuGet 包的形式提供,但如果涉及 .NET Native,开发人员的体验就会变得略微分散。对于 Visual Studio 2017,用于 UWP 开发的所有 .NET(包括 .NET Native)以 UWP NuGet 包 .NET 实现的形式提供。这样一来,可以按自己的步调灵活迁移,具体方法为根据需要指定已知适用于应用的 .NET 版本。

.NET Standard 2.0 和 UWP 开发

根据本文前述内容,Windows 10 Fall Creators Update 支持 .NET Standard 2.0。为了利用 .NET Standard 2.0 实现,必须将 UWP 项目的 TargetPlatformMinVersion 设置为 Windows 10 Fall Creators Update 或更高版本,如图 5 所示。还必须引用 Microsoft.NETCore.UniversalWindowsPlatform NuGet 包版本 6.0 或更高版本。

与 .NET Standard 2.0 兼容的 UWP 应用
图 5:与 .NET Standard 2.0 兼容的 UWP 应用

Microsoft.NETCore.UniversalWindowsPlatform NuGet 包利用了 UWP 开发的平台多目标支持,以便始终都可以更新到最新版包。如果要生成的应用的 TargetPlatformMinVersion 低于 Windows 10 Fall Creators Update,NuGet 还原过程会引入 Windows 10 .NET Core 的 .NET Standard 1.4 实现。如果将 TargetPlatformMinVersion 设置为 Windows 10 Fall Creators Update 或更高版本,NuGet 会引入 Windows 10 .NET Core 的 .NET Standard 2.0 实现。现在,说得够多了。归根结底,就是不应当担心要引用的 NuGet 包版本。可以始终引用最新版本,并且它应该一直可用,无论 Windows 10 目标是哪个。 

实用的开放源代码项目

最后,我们想介绍一些实用的开放源代码项目,可用于加速 UWP 开发。这些项目包括 Windows Template Studio、UWP Community Toolkit 和用于 UWP 开发的 Telerik Controls。

Windows Template Studio:Windows Template Studio(如图 6 所示)是用于 UWP 开发的动态模板生成器。这是开始生成面向生产的 UWP 应用的最快速方法。它利用最佳开发做法,方便用户在简单的向导体验中生成多个视图、后台任务等。对组织中的所有新应用开发使用 Windows Template Studio 可有助于确保应用具有一致的外观,并鼓励采用应用体系结构的最佳做法。Windows Template Studio 由充满激情的 Windows 开发人员社区进行生成、维护和更新,同时也是开始生成全面 UWP 应用的绝佳方式 (aka.ms/wts)。

Windows Template Studio 项目生成
图 6:Windows Template Studio 项目生成

用于 UWP 开发的 Telerik Controls:早在 2017 年 2 月,Telerik 就宣布,即将开放 UWP 控件库的 Telerik UI 的源代码。拥有许可证的任何人都可以免费使用它生成 UWP 应用。Telerik 曾生成过面向企业的控件,不仅功能强大,性能还非常高;而现在,可以在 UWP 开发时免费使用!若要详细了解 Telerik 开放源代码公告,请阅读此公司的博客 (bit.ly/2AZA0iI)。

UWP Community Toolkit:UWP Community Toolkit (github.com/Microsoft/UWPCommunityToolkit) 是另一个社区驱动项目,提供了实用的 UWP 开发工具。工具包内含模板化动画、控件、帮助程序类、服务等。UWP Community Toolkit 可用于加速开发。

结束语

对于 .NET 和 UWP 开发人员,明显发生了很多变化。有了这么多的新工具和更新,就可以尽可能加快和简化生成 Windows 应用。借助 .NET Standard 2.0 和所有免费资源,使用通用 Windows 平台生成面向企业的应用从未如此简单过。对于 .NET 开发人员,结合使用桌面桥平台和更新后的工具,可以生成功能强大的桌面应用,以充分利用 UWP 和 Win32(包括 WPF 和 Windows 窗体)。Microsoft 一直在根据客户反馈不断改进自己的工具。所以,生成 Windows 应用时,可以随时通过电子邮件或 Twitter 与我们联系。


Daniel Jacobson 是 Visual Studio 项目经理,负责面向 Windows 平台开发人员的工具。**可以通过 dajaco@microsoft.com 或 Twitter (@pmatmic) 与他联系。

Stefan Wick**** 是 Windows 资深项目经理,负责通用 Windows 平台。**可以通过 swick@microsoft.com 或 Twitter (@StefanWickDev) 与他联系。

衷心感谢以下 Microsoft 技术专家对本文的审阅:Mike Harsh、Matthijs Hoekstra、Unni Ravindranathan 和 Ricardo (Rido) Minguez
Unni Ravindranathan 是 Visual Studio 团队项目经理,主要负责生成面向 Windows 应用开发人员的世界一流工具。

Mike Harsh 是 Windows 开发人员平台团队的小组项目经理。

Matthijs Hoekstra 是开发人员平台团队的高级项目经理。


在 MSDN 杂志论坛讨论这篇文章