.NET 5.0 RC2 釋出,正式版即將在 11 月 .NET Conf 大會上釋出
阿新 • • 發佈:2020-10-16
> 原文:http://dwz.win/ThX
> 作者:Richard
> 翻譯:精緻碼農-王亮
> 說明:本譯文捨棄了少許我實在不知道如何翻譯但又不是很重要的語句。
今天(10月13日)我們釋出了 .NET 5.0 候選版本 2(RC2),它是 11 月 .NET 5.0 正式版釋出前的最後一個 RC 版本。RC2 是一個“上線”版本,表示你可以在生產環境中使用它。與此同時,我們正在找尋任何遺漏的關鍵 Bug 報告,這些 Bug 應該在最終釋出前得到修復。
我們今天也釋出了 [ASP.NET Core](https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-5-release-candidate-2/) 和 [EF Core](https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-ef-core-5-rc2/) 的 RC2 版本。
你可以[下載適用於 Windows、macOS 和 Linux 的 .NET 5.0 版本](https://dotnet.microsoft.com/download/dotnet/5.0):
- [安裝程式和二進位制包](https://dotnet.microsoft.com/download/dotnet/5.0)
- [容器映象](https://hub.docker.com/_/microsoft-dotnet)
- [快速安裝程式](https://snapcraft.io/dotnet-sdk)
- [釋出說明](https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-rc.2.md)
- [已知問題](https://github.com/dotnet/core/blob/master/release-notes/5.0/5.0-known-issues.md)
- [GitHub Issue 跟蹤](https://github.com/dotnet/core/issues/5345)
你需要最新的預覽版 Visual Studio (包括 Visual Studio for Mac) 才能使用 .NET 5.0。
.NET 5.0 包括[許多改進](https://github.com/dotnet/runtime/issues/37269),特別是[單檔案應用程式](https://github.com/dotnet/runtime/issues/36590)、[更小的容器映象](https://github.com/dotnet/dotnet-docker/issues/1814#issuecomment-625294750)、[功能更強的 JsonSerializer API](https://github.com/dotnet/runtime/issues/41313)、一套完整的[可空引用型別標註](https://twitter.com/terrajobst/status/1296566363880742917)、新的[Target Framework 名稱](https://github.com/dotnet/designs/blob/master/accepted/2020/net5/net5.md),以及對 [Windows ARM64](https://github.com/dotnet/runtime/issues/36699) 的支援。在 .NET 庫、GC 和 JIT 中,效能得到了極大的提高。我們[花了很大的工作在 ARM64 的效能上](https://devblogs.microsoft.com/dotnet/arm64-performance-in-net-5/),它有了更好的吞吐量和更小的二進位制檔案。.NET 5.0 包含了新的語言版本:C# 9.0 和 F# 5.0。你可以檢視一些 [.NET 5.0 示例](https://gist.github.com/richlander/50c34a8714eb3436e5d9d4d5d420776e),以便你可以親自嘗試這些功能。
今天是個大好日子,因為我們將拉開 2020 年 .NET@Microsoft 內部會議的序幕。屆時將有許多來自 .NET 團隊的演講者,也有來自服務團隊的開發人員和架構師,他們依靠 .NET 來驅動微軟雲,分享他們的勝利,也分享他們的挑戰。我的演講(不出所料)是“.NET 5.0 中有什麼新內容”。我的演講將很簡單,會涵蓋我的 .NET 5.0 博文所講到的內容!這將是一場精彩的演講。更重要的是,這次會議是我們的機會,讓我們說明為什麼微軟團隊應該在 .NET 5.0 釋出後儘快採用它。我所知道的至少有一個大型團隊正在生產中執行 RC1。[微軟官方.NET網站](https://dotnet.microsoft.com/) 從 Preview 1 開始就一直在執行.NET 5.0,現在正在執行 RC2。本週微軟團隊向我們展示的案例,會與我在所有這些 .NET 5.0 部落格文章中向你展示的案例非常相似。.NET 5.0 是一個偉大的版本,它將從根本上改善你的應用程式。
說到會議,請記住 [.NET Conf 2020](https://www.dotnetconf.net/) 的日期(譯註:11月10日至12日)。今年,.NET 5.0 將在 .NET Conf 2020 上釋出!請來慶祝並瞭解新版本。我們還將慶祝我們的 10 週年紀念日,我們正在努力創造更多的驚喜,值得你的期待。
就像我為 [.NET 5.0 Preview 8](https://devblogs.microsoft.com/dotnet/announcing-net-5-0-preview-8/) 和 [.NET 5.0 RC1](https://devblogs.microsoft.com/dotnet/announcing-net-5-0-rc-1/) 所做的那樣,我選擇了一些功能來更深入地介紹,並讓你瞭解如何在實際情況中使用它們。這篇文章專門介紹 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 中的三個新模式是:
- 關係模式,使用關係運算符,如 `<` 和 `>=`。
- 邏輯模式,使用關鍵字 `and`、`or`、`not`。一個簡短的例子是 `foo is not null`。當你想在一個模式中比較多個事物時,這種型別的模式是最有用的。
- 簡單型別模式,只使用一個型別,而不使用其他語法進行匹配。
我是 [BBC 夏洛克系列](https://en.wikipedia.org/wiki/Sherlock_(TV_series))的忠實粉絲。我寫了一個小程式,可以決定一個給定的角色是否應該訪問該系列中的某個內容。很簡單,這個應用的編寫有兩個限制條件:忠於劇中的時間線和人物,這是一個很好的模式演示。如果有的話,我懷疑我在第二個約束條件上最失敗。在一個特定的應用程式中(尤其是這樣一個小應用程式),你會發現一套比人們預期的更廣泛的模式和風格。
當我在使用模式時,我有時想做一些與我所熟悉的模式實現稍微不同的事情,但不知道如何擴充套件該模式來滿足我的目標。鑑於這個示例,我希望你能發現更多的方法,也許你以前不知道這些可以擴充套件你熟悉的模式的技巧。
應用內有兩個 switch 表示式,讓我們從兩個中較小的一個開始。
```cs
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` 的型別模式例項。
```cs
if (user is Mycroft m && m.CaresAbout is not object)
{
Console.WriteLine("Mycroft dissapoints us again.");
}
```
這裡不知道 `user` 變數的型別,所以測試它是不是 `Mycroft` 型別,如果是,則分配給 `m`。同時判斷 `Mycroft` 物件上的一個屬性是否是一個 object 型別。這裡是為了演示邏輯模式 not 的使用,其實用 `is null` 是一樣的效果。
另一種 switch 表示式則要寬泛得多。
```cs
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 博文](https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/#improved-pattern-matching)中演示的語法,它們是等價的。
```cs
(OpenCaseFile {RiskLevel: var riskLevel}, {Type: StateSecret}, 3) when riskLevel switch
{
> 50 and <100 => true,
_ => false
}
```
我遠不是一個語言專家,[Jared Parsons](https://twitter.com/jaredpar) 和 [Andy Gocke](https://twitter.com/andygocke) 在本文這一部分給了我很多幫助,謝謝!我的關鍵絆腳石是一個元組的 switch。有時,位置模式很不方便,你只想使用元組的一部分。這就是屬性模式的作用,你可以在下面的程式碼中看到。
```cs
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
```
這裡面有相當多的問題。關鍵的一點是,這裡測試的是元組屬性,而不是按位置匹配元組。這種方法提供了更多的靈活性。你可以在一個給定的 switch 表示式中自由地混合這些方法。希望這能幫助一些人,至少對我有幫助。
如果你對這個應用的功能很好奇,我已經把程式的輸出儲存在 [app gist](https://gist.github.com/richlander/c911b8e3a0aefcefee9e01ee338a5fdd#gistcomment-3487781) 中。你也可以自己執行這個程式。它需要 .NET 5.0 RC2 才能執行。
## ClickOnce
多年來,[ClickOnce](https://docs.microsoft.com/visualstudio/deployment/walkthrough-manually-deploying-a-clickonce-application) 一直是一個流行的 .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 的體驗開始,它是以專案釋出為中心的。
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/FolderTargets.png)
我們目前支援的主要部署模式是[框架依賴型應用](https://docs.microsoft.com/dotnet/core/deploying/)。很容易採取依賴 .NET 桌面執行時(就是包含 WPF 和 Windows Forms 的那個)。如果需要的話,你的 ClickOnce 安裝程式將在使用者機器上安裝 .NET 執行時。我們還打算支援獨立的和單檔案的應用程式。
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/Prerequisites.png)
你可能會想知道,你是否還能利用 ClickOnce 的離線和更新功能。是的,你可以。
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/Settings.png)
包括相同的安裝位置和清單簽署功能。如果你有嚴格的簽名要求,你會喜歡上這個新的體驗。
現在,讓我們切換到 [Mage](https://docs.microsoft.com/dotnet/framework/tools/mage-exe-manifest-generation-and-editing-tool) 的命令列體驗。
[Mage](https://docs.microsoft.com/dotnet/framework/tools/mage-exe-manifest-generation-and-editing-tool) 最大的變化是,它現在是一個 .NET 工具,釋出在 NuGet 上。這意味著你不需要在你的機器上安裝任何特殊的東西。你只需要 .NET 5.0 SDK,然後你就可以把 Mage 作為一個 .NET 工具來安裝。你也可以用它來發布 .NET 框架的應用程式,不過,SHA1 簽名和部分信任支援已經被移除。
Mage 的安裝命令如下:
```bash
dotnet tool install -g Microsoft.DotNet.Mage
```
用以下命令配置併發布示例應用程式:
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/ProduceFirstDeployment-768x184.png)
下面一條命令將啟動ClickOnce應用程式:
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/InstallFirstVersion.png)
然後出現熟悉的 ClickOnce 安裝對話方塊:
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/FirstInstallClickoncePrompt.png)
安裝應用後,會啟動應用:
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/FirstVersionAppRuns.png)
重新構建並重新發布應用程式後,使用者將看到一個更新對話方塊:
![ ](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/10/UpdateAvailable.png)
更新後的應用程式將被啟動。
注意: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 安裝程式圖片中看到。
![ ](https://user-images.githubusercontent.com/2608468/95817629-d326c480-0cd6-11eb-991e-92ed0c84ad52.png)
為了進一步證明這一點,我在 Arm64 機器上執行 `dotnet-runtimeinfo` 工具來演示配置。
```powershell
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](https://twitter.com/dotnet)
- [Facebook](https://www.facebook.com/Dotnet/)