.NET 5.0 RC 2 发布,正式版将在 11 月 .NET Conf 大会上发布

语言: CN / TW / HK

原文:http://dwz.win/ThX
作者:Richard
翻译:精致码农-王亮
说明:
1. 本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句。
2. 本文有不少超链接,由于微信公众号和头条平台外链会被剔除 URL 地址,所以原来本是超链接的内容会显示为纯文本,如果你需要这些信息可以移步到我的知乎和博客园阅读(搜索“精致码农”可找到我)。




今天(10月13日)我们发布了 .NET 5.0 候选版本 2(RC2),它是 11 月 .NET 5.0 正式版发布前的最后一个 RC 版本。RC2 是一个“上线”版本,表示你可以在生产环境中使用它。与此同时,我们正在找寻任何遗漏的关键 Bug 报告,这些 Bug 应该在最终发布前得到修复。

我们今天也发布了 ASP.NET Core 和 EF Core 的 RC2 版本。

你可以下载适用于 Windows、macOS 和 Linux 的 .NET 5.0 版本:

  • 安装程序和二进制包

  • 容器镜像

  • 快速安装程序

  • 发布说明

  • 已知问题

  • GitHub Issue 跟踪

你需要最新的预览版 Visual Studio (包括 Visual Studio for Mac) 才能使用 .NET 5.0。

.NET 5.0 包括许多改进,特别是单文件应用程序、更小的容器镜像、功能更强的 JsonSerializer API、一套完整的可空引用类型标注、新的Target Framework 名称,以及对 Windows ARM64 的支持。在 .NET 库、GC 和 JIT 中,性能得到了极大的提高。我们花了很大的工作在 ARM64 的性能上,它有了更好的吞吐量和更小的二进制文件。.NET 5.0 包含了新的语言版本:C# 9.0 和 F# 5.0。你可以查看一些 .NET 5.0 示例,以便你可以亲自尝试这些功能。

今天是个大好日子,因为我们将拉开 2020 年 .NET@Microsoft 内部会议的序幕。届时将有许多来自 .NET 团队的演讲者,也有来自服务团队的开发人员和架构师,他们依靠 .NET 来驱动微软云,分享他们的胜利,也分享他们的挑战。我的演讲(不出所料)是“.NET 5.0 中有什么新内容”。我的演讲将很简单,会涵盖我的 .NET 5.0 博文所讲到的内容!这将是一场精彩的演讲。更重要的是,这次会议是我们的机会,让我们说明为什么微软团队应该在 .NET 5.0 发布后尽快采用它。我所知道的至少有一个大型团队正在生产中运行 RC1。微软官方.NET网站 从 Preview 1 开始就一直在运行.NET 5.0,现在正在运行 RC2。本周微软团队向我们展示的案例,会与我在所有这些 .NET 5.0 博客文章中向你展示的案例非常相似。.NET 5.0 是一个伟大的版本,它将从根本上改善你的应用程序。

说到会议,请记住 .NET Conf 2020 的日期(译注:11月10日至12日)。今年,.NET 5.0 将在 .NET Conf 2020 上发布!请来庆祝并了解新版本。我们还将庆祝我们的 10 周年纪念日,我们正在努力创造更多的惊喜,值得你的期待。

就像我为 .NET 5.0 Preview 8 和 .NET 5.0 RC1 所做的那样,我选择了一些功能来更深入地介绍,并让你了解如何在实际情况中使用它们。这篇文章专门介绍 C# 9 模式匹配、Windows ARM64 和 ClickOnce。

C# 9 模式匹配

模式匹配是在 C# 7.0 中加入的语言特性。不妨让 Mads 重新介绍一下这个概念,这是他最初介绍这个特性时的说法:

C# 7.0 引入了模式的概念,抽象地说,模式是一种语法元素,它可以测试一个值是否具有一定的“形状”,当它具有一定的“形状”时,就从该值中提取信息。

这是一个非常好的描述,完美的措辞。

C# 团队在 C# 7、C# 8 和 C# 9 的每个版本中都添加了新的模式。在这篇文章中,你将看到这些语言版本中的每一种模式,但我们将重点关注 C# 9 中的新模式。

C# 9 中三个新模式是:

  • 关系模式,使用关系运算符,如 < 和 >=

  • 逻辑模式,使用关键字 andornot。一个简短的例子是 foo is not null。当你想在一个模式中比较多个事物时,这种类型的模式是最有用的。

  • 简单类型模式,只使用一个类型,而不使用其他语法进行匹配。

我是 BBC 夏洛克系列的忠实粉丝。我写了一个小程序,可以决定一个给定的角色是否应该访问该系列中的某个内容。很简单,这个应用的编写有两个限制条件:忠于剧中的时间线和人物,这是一个很好的模式演示。如果有的话,我怀疑我在第二个约束条件上最失败。在一个特定的应用程序中(尤其是这样一个小应用程序),你会发现一套比人们预期的更广泛的模式和风格。

当我在使用模式时,我有时想做一些与我所熟悉的模式实现稍微不同的事情,但不知道如何扩展该模式来满足我的目标。鉴于这个示例,我希望你能发现更多的方法,也许你以前不知道这些可以扩展你熟悉的模式的技巧。

应用内有两个 switch 表达式,让我们从两个中较小的一个开始。

public static bool IsAccessOKAskMycroft(Person person) => person switch
{
    // Type pattern
    OpenCaseFile f when f.Name == "Jim Moriarty"    => true,
    // Simple type pattern
    Mycroft                                         => true,
    _                                               => false,
};

前两种模式是类型模式。第一个模式是 C# 8 就支持的。第二种--Mycroft--是新的简单类型模式的一个例子。在 C# 8 中,这个模式需要一个标识符,就像第一个模式一样,或者至少需要一个弃元,比如 Mycroft _。在 C# 9 中,不再需要标识符。是的, Mycroft 是应用程序中的一个类型。

在我向你展示另一个 switch 表达式之前,让我们再简单一点。下面的 if 语句演示了一个逻辑模式,是两个使用 is 的类型模式实例。

if (user is Mycroft m && m.CaresAbout is not object)
{
    Console.WriteLine("Mycroft dissapoints us again.");
}

这里不知道 user 变量的类型,所以测试它是不是 Mycroft 类型,如果是,则分配给 m。同时判断 Mycroft 对象上的一个属性是否是一个 object 类型。

另一种 switch 表达式则要宽泛得多。

public static bool IsAccessOkOfficial(Person user, Content content, int season)
    => (user, content, season) switch
{
    // Tuple + property patterns
    ({Type: Child}, {Type: ChildsPlay}, _)          => true,
    ({Type: Child}, _, _)                           => false,
    (_ , {Type: Public}, _)                         => true,
    ({Type: Monarch}, {Type: ForHerEyesOnly}, _)    => true,
    // Tuple + type patterns
    (OpenCaseFile f, {Type: ChildsPlay}, 4) when f.Name == "Sherlock Holmes"  => true,
    // Property and type patterns
    {Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
        when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
    // Tuple and type patterns
    (OpenCaseFile, var c, 4) when c.Name.Contains("Sherrinford")              => true,
    // Tuple, Type, Property and logical patterns
    (OpenCaseFile {RiskLevel: >50 and <100 }, {Type: StateSecret}, 3) => true,
    _                                               => false,
};

唯一真正有趣的模式是最后一个模式(在弃元-之前),它测试 Risklevel 是否 >50 且 <100。有很多次我都想用这种形式的逻辑模式语法写一个 if 语句,而不需要重复一个变量名。这个逻辑模式也可以用下面的方式来代替,并且会更接近这篇 C# 9 博文中演示的语法,它们是等价的。

(OpenCaseFile {RiskLevel: var riskLevel}, {Type: StateSecret}, 3) when riskLevel switch
{
    >50 and <100        => true,
    _                   => false
}

我远不是一个语言专家,Jared Parsons 和 Andy Gocke 在本文这一部分给了我很多帮助,谢谢!我的关键绊脚石是一个元组的 switch。有时,位置模式很不方便,你只想使用元组的一部分。这就是属性模式的作用,你可以在下面的代码中看到。

{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
    when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,

这里面有相当多的问题。关键的一点是,这里测试的是元组属性,而不是按位置匹配元组。这种方法提供了更多的灵活性。你可以在一个给定的 switch 表达式中自由地混合这些方法。希望这能帮助一些人,至少对我有帮助。

如果你对这个应用的功能很好奇,我已经把程序的输出保存在 app gist 中。你也可以自己运行这个程序。它需要 .NET 5.0 RC2 才能运行。

ClickOnce

多年来,ClickOnce 一直是一个流行的 .NET 部署选项。现在它已支持为 .NET Core 3.1 和 .NET 5.0 Windows 应用程序。当我们在 .NET Core 3.0 中添加了 Windows Forms 和 WPF 支持时,我们就知道很多人会希望使用 ClickOnce 来部署应用程序。在过去的一年里,.NET 和 Visual Studio 团队共同合作,在命令行和 Visual Studio 中启用了 ClickOnce 发布。

我们从项目一开始就有两个目标:

  • 在 Visual Studio 中实现熟悉的 ClickOnce 体验。

  • 使用 MSBuild 或 Mage 工具,通过命令行流程为 ClickOnce 发布启用现代 CI/CD。

用图片向你展示体验是最简单的。

我们先从 Visual Studio 的体验开始,它是以项目发布为中心的。

我们目前支持的主要部署模式是框架依赖型应用。很容易采取依赖 .NET 桌面运行时(就是包含 WPF 和 Windows Forms 的那个)。如果需要的话,你的 ClickOnce 安装程序将在用户机器上安装 .NET 运行时。我们还打算支持独立的和单文件的应用程序。

你可能会想知道,你是否还能利用 ClickOnce 的离线和更新功能。是的,你可以。

包括相同的安装位置和清单签署功能。如果你有严格的签名要求,你会喜欢上这个新的体验。

现在,让我们切换到 Mage 的命令行体验。

Mage 最大的变化是,它现在是一个 .NET 工具,发布在 NuGet 上。这意味着你不需要在你的机器上安装任何特殊的东西。你只需要 .NET 5.0 SDK,然后你就可以把 Mage 作为一个 .NET 工具来安装。你也可以用它来发布 .NET 框架的应用程序,不过,SHA1 签名和部分信任支持已经被移除。

Mage 的安装命令如下:

dotnet tool install -g Microsoft.DotNet.Mage

用以下命令配置并发布示例应用程序:

下面一条命令将启动ClickOnce应用程序:

然后出现熟悉的 ClickOnce 安装对话框:

安装应用后,会启动应用:

重新构建并重新发布应用程序后,用户将看到一个更新对话框:

更新后的应用程序将被启动。

注意:Mage .NET 工具的名称将从 mage.net 改为 dotnet-mage,NuGet 包名将保持不变。

这个围绕 ClickOnce 发布和安装的快速指南应该会让你对如何使用 ClickOnce 有一个好的认识。我们的意图是与使用现有 .NET 框架的 ClickOnce 支持有一样的体验。如果你发现我们没有达到这个目标,请告诉我们。

ClickOnce 浏览器集成与 .NET Framework 相同,在 Edge 和 Internet Explorer 中得到支持。如果支持其他浏览器对你的用户有多重要,也请告诉我们。

Windows Arm64

MSI 安装程序现在可以用于 Windows Arm64,你可以从下面的 .NET 5.0 SDK 安装程序图片中看到。

为了进一步证明这一点,我在 Arm64 机器上运行 dotnet-runtimeinfo 工具来演示配置。

C:\Users\rich>dotnet tool install -g dotnet-runtimeinfo
You can invoke the tool using the following command: dotnet-runtimeinfo
Tool 'dotnet-runtimeinfo' (version '1.0.2') was successfully installed.

C:\Users\rich>dotnet-runtimeinfo
**.NET information
Version: 5.0.0
FrameworkDescription: .NET 5.0.0-rc.2.20475.5
Libraries version: 5.0.0-rc.2.20475.5
Libraries hash: c5a3f49c88d3d907a56ec8d18f783426de5144e9

**Environment information
OSDescription: Microsoft Windows 10.0.18362
OSVersion: Microsoft Windows NT 10.0.18362.0
OSArchitecture: Arm64
ProcessorCount: 8

.NET 5.0 SDK 目前不包含 Windows Arm64 上的 Windows 桌面组件--Windows Forms 和 WPF。这一迟来的变化最初是在 .NET 5.0 Preview 8 的帖子中分享的。我们希望在 5.0 服务更新中为 Windows Arm64 添加 Windows 桌面包,我们目前还没有确定具体的日期。目前,Windows Arm64 上支持 SDK、控制台和 ASP .NET Core 应用程序。

结束

我们现在非常接近完成 5.0 这个版本,并已将其传递出去以供广泛的生产使用。我们相信它已经准备好了。它在微软的生产环境中使用,已经给我们带来了很大的信心。我们期待你有机会在自己的环境中真正使用 .NET 5.0。

我们已经很久没有分享我们的社交媒体了,敬请关注我们的 dotnet 维护信息:

  • Twitter

  • Facebook

-

精致码农

带你洞悉编程与架构

↑长按图片识别二维码关注,不要错过网海相遇的缘分

分享到: