1. 程式人生 > >.NET 5.0 RC2 釋出,正式版即將在 11 月 .NET Conf 大會上釋出

.NET 5.0 RC2 釋出,正式版即將在 11 月 .NET Conf 大會上釋出

> 原文: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/)