.NET 7 預覽版 1 發佈
- 2022 年 2 月 18 日
- 筆記
宣布 .NET 7 預覽版 1
Jeremy 2022 年 2 月 17 日
今天,我們很高興地宣布 .NET 歷史上的下一個里程碑。在慶祝社區和 20 年創新的同時,.NET 7 Preview 1 標誌着邁向 .NET 下一個 20 年的第一步。
ASP.NET Core Preview 1 和 EF7 Preview 1 也在今天發佈。
.NET 7 建立在 .NET 6 建立的基礎之上,包括一套統一的基礎庫、運行時和 SDK,簡化了開發體驗,提高了開發人員的工作效率。.NET 7 的主要關注領域包括改進對雲原生方案的支持、更容易升級舊項目的工具,以及通過更輕鬆地使用容器來簡化開發人員體驗。
.NET 7 Preview 1 包括對 API 的支持可空性的註解、持續的 JIT 編譯器優化、新的 API 以及對更多熱重載方案的支持。
.NET 版本包括產品、類庫、運行時和工具,代表了 Microsoft 內外多個團隊之間的協作。本篇博文中涵蓋的更廣泛的主題並未涵蓋 .NET 7 的所有關鍵場景和投資。它們代表了很大的領域,但只是進入 .NET 7 中所有重要工作的一部分。我們計劃對 ASP.NET Core、Blazor、EF Core、WinForms、WPF 和其他平台進行廣泛投資,您可以通過閱讀產品路線圖了解關於這些領域的更多信息:
- ASP.NET Core、Blazor 和 Orleans
- EF7
- ML.NET
- .NET MAUI
- WinForms
- WPF
- NuGet
- [Roslyn](//github.com/dotnet/roslyn/blob/main/docs/Language Feature Status.md)
您可以下載適用於 Windows、macOS 和 Linux 的.NET 7 Preview 1 。
.NET 7 已通過 Visual Studio 17.2 預覽版 1 進行測試。如果您想在 Visual Studio 系列產品中試用 .NET 7,我們建議您使用預覽頻道版本。Visual Studio for Mac 對 .NET 7 預覽版的支持尚不可用,但即將推出。
現代化客戶端:.NET 多平台應用程序 UI (.NET MAUI)
.NET MAUI 是 .NET 跨平台原生 UI 的未來,將成為 .NET 7 的一部分。周二,我們發佈了.NET MAUI Preview 13。我們目前專註於為 .NET 6 提供 .NET MAUI 支持,我們預計很快會提供一個候選版本 (RC)。在我們有可用的 RC 後,我們將專註於發佈額外的 RC,直到我們達到一般可用性 (GA) 所需的穩定性。在 .NET MAUI GA 為 .NET 6 發佈後,我們將把它包含在 .NET 7 中,並着眼於改進內部開發循環體驗、支持最新的 .NET SDK 工具、更快的應用程序性能、共享更多代碼以及增強的互操作等主題。查看.NET MAUI 的狀態和項目路線圖以獲取更多信息。
現代云:容器和雲原生
從零開始構建雲原生應用程序,利用基於 Web 的現代資源,例如數據庫服務和託管容器。雲原生架構可以通過創建獨立於應用程序的其他區域進行部署和擴展的自治子系統(通常稱為微服務)來提高大型應用程序的規模,同時降低長期成本。微服務架構是一種流行的方法,因為它很靈活,旨在發展和擴展至單體架構中難以實現的極限。
.NET 7 將通過探索對開發人員體驗的改進來更輕鬆地構建雲原生應用程序,例如:
- 簡化實施安全身份驗證和授權所需的設置和配置
- 提高應用程序啟動和運行時執行的性能。
我們將繼續投資Orleans,這是一個 .NET 跨平台框架,用於構建被稱為「分佈式 .NET」的分佈式應用程序。我們將繼續增強 Orleans 的綜合文檔,並通過改進 Orleans 與Azure App Services和Azure Container Apps等現有雲服務的集成,使其更易於使用和實施。
容器是當今許多公司部署雲原生應用程序和微服務的首選方式。依賴容器帶來了一些挑戰,包括管理兼容性、構建和發佈鏡像、讓鏡像更安全以及簡化鏡像的大小和性能。我們相信有機會使用 .NET 容器創造更好的體驗。
為了幫助客戶應對這些挑戰,我們計劃使用 .NET 7 中的容器對 .NET 開發進行重大改進。例如,我們將探索通過 MSBuild 直接構建容器作為 SDK 的一項新功能。我們計劃增強遙測以提高容器的可觀察性。我們還將專註於使我們的容器鏡像更小、更快、更安全,同時探索高要求的應用模型,例如 rootless 和 distroless。
現代化:升級 .NET 應用程序
自 .NET 6 發佈以來,開發人員一直在升級他們的應用程序,以利用新的性能提升、最小 API 和熱重載等生產力特性、新的運行時和 C# 語言創新以及成熟的庫和工具生態系統的可用性。在 .NET 7 中,我們將繼續使您能夠將現有的 .NET 應用程序升級到最新的 .NET 平台和技術。.NET 升級助手中的更多分析器、代碼修復程序和對其他應用程序類型的支持將幫助您自信地升級更多應用程序組合,並減少升級所涉及的重複性任務的時間。
我們還知道,每個 .NET 應用程序模型(ASP.NET、WinForms、WPF 等)在現代化方面都有其獨特的挑戰,並且可能缺少開發人員所需的功能或平台本身的支持。對於其中一些,例如 WCF,可能沒有明確的方向。我們將專註於提供適當的指導、文檔和工具,以使這些 .NET 應用程序模型更易於升級。
支持
.NET 7 是 Current 版本,這意味着它將在發佈之日起 18 個月內獲得免費支持和補丁。請務必注意,所有版本的質量都是相同的。LTS 和當前版本之間的唯一區別是支持的長度。有關 .NET 支持政策的更多信息,請參閱.NET 和 .NET Core 官方支持政策。
重大變化
您可以通過閱讀 .NET 7 中的重大更改文檔找到最新的 .NET 7 重大更改列表。它按區域和版本列出了重大更改,並附有詳細說明的鏈接。
要查看提出了哪些重大更改但仍在審核中,請關注Proposed .NET Breaking Changes GitHub 問題。
預覽 1
Preview 1 版本現在提供以下功能。
Microsoft.Extensions 的可空註解
我們在為 Microsoft.Extensions.* 庫添加註解以實現可空性方面取得了進展。在 .NET 7 Preview 1 中,以下庫已針對可空性進行了注釋:
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.Logging.Abstractions
- Microsoft.Extensions.Primitives
- Microsoft.Extensions.FileSystemGlobbing
- Microsoft.Extensions.DependencyModel
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.FileProviders.Abstractions
- Microsoft.Extensions.FileProviders.Physical
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.CommandLine
- Microsoft.Extensions.Configuration.EnvironmentVariables
- Microsoft.Extensions.Configuration.FileExtensions
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
到 .NET 7 發佈時,我們計劃為所有 Microsoft.Extensions.* 庫添加可空性注釋。您可以查看剩餘的庫,並在dotnet/runtime#43605處關注進度。
非常感謝 @maxkoshevoi,他為這項工作做出了很大貢獻。如果沒有 @maxkoshevoi 的幫助,我們就不會走得那麼遠。
可觀察性
繼續改進跟蹤 API:
- 添加
ActivityContext.TryParse
重載以允許解析和創建ActivityContext
對象,包括是否從遠程父級傳播活動上下文(相關問題)。 - 添加
Activity.IsStopped()
指示Activity
對象是否停止的方法(相關問題)。
代碼生成
社區 PR(非常感謝 JIT 社區貢獻者!!)
來自@am11
來自@anthonycanino
來自@SeanWoo
來自@SingleAccretion
- 在調用更好的運行時調整浮點 CSE runtime#63903
- 調整大小時更新新 CSE 的哈希 runtime#61984
- 重寫字段選擇並始終在 VN 規範化 SIMD 類型 runtime#61370
- 添加有關 VN 如何編號內存的文檔 runtime#60476
- 改進強制轉換數值 runtime#59841
- 在塊 morphing 中的複雜本地地址下的地址暴露本地變量 runtime#63100
- 處理嵌入式分配時複製傳播 runtime#63447
- 異常集:調試器檢查和修復 runtime#63539
- 在 emitOutputAM 實現「moffset」編碼大小優化 runtime#62896
- 壓縮操作數種類數組並優化 OperIsLocal runtime#63253
- 使 gtHasRef 關注 LCL_FLD 節點 runtime#62568
- 為 GT_LCL_FLD 啟用全局常量傳播 runtime#61209
- 為小型類型啟用全局常量傳播 runtime#57726
- fgMemoryVNForLoopSideEffects 屬性類型主選擇器 runtime#60505
來自@RalfKornmannEnvision
來自@weilinwa
動態 PGO
- 對 Arm64 的 OSR 支持
- JIT:支持同步方法的 OSR
- JIT:處理 OSR、PGO 和尾調用的交互
- 添加 2009 Jit 架構計劃(節選)
- JIT:一些 relops 的有限版本的前向替換
- JIT:為後期去虛擬化保存泛型上下文
Arm64
- Arm64:內存屏障改進
- 在 InitBlkUnroll/CopyBlkUnroll 中使用 SIMD 操作並將展開限制增加到 128 位元組
- [Arm64] 繼續展開 InitBlock 和 CopyBlock 最多 128 位元組
- ‘cmeq’ 和 ‘fcmeq’ Vector64.Zero/Vector128.Zero ARM64 包含優化
- [arm64] JIT: X % 2 == 0 -> X & 1 == 0
- [arm64] JIT:添加符號/零擴展
- [arm64] JIT:為「arrayBase + elementOffset」啟用 CSE/提升
- [arm64] JIT:將「A * B + C」摺疊為 MADD/MSUB
循環優化
通用優化
- 加速其他跨平台硬件內在函數
- 使用 SIMDAsHWIntrinsic 實現 Narrow 和 Widen
- 添加 IsKnownConstant jit 助手並使用 str.StartsWith(‘c’) 優化 ‘str == 「」’
- 允許 JIT 在將 HFA/HVA 作為參數/返回值傳遞時將它們保留在寄存器中
- 為 Vector64/128/256 啟用對 nint/nuint 的支持
- 添加對 X86Base.Pause() 和 ArmBase.Yield() 的支持
- 將 PAL 中的首選區域用於 JIT reloc 提示
- 支持 R2R 中的快速尾調用
- 允許在 x64 上的尾調用中包含間接尋址
- 更一般地優化間接單元調用序列
- 避免為委託調用創建額外的本地
互操作:p/Invoke 代碼生成
我們將在 .NET 6 中原型化的 p/invoke 源生成器(Source Generator) 集成到 dotnet/runtime 中,並且一直在轉換運行時庫以使用它。這意味着轉換後的 p/invokes 與 AOT 兼容,不再需要在運行時生成 IL Stub。
我們打算在未來使 p/invoke 源生成器在運行時之外可用。您可以在dotnet/runtime#60595中關注我們剩餘的工作。
System.Text.Json 中的新 API
System.Text.Json 附帶了一些小的生命周期增強功能:
- 開發人員現在可以訪問System.Text.Json 內部使用的默認單例
JsonSerializerOptions
(相關問題)。 - 添加一個
JsonWriterOptions.MaxDepth
屬性並確保此值來自序列化的JsonSerializerOptions.MaxDepth
等效屬性(相關問題)。 - 將
Patch
方法添加到System.Net.Http.Json
(相關問題)。
熱重載改進
現在允許在 C# 熱重載中為 Blazor WebAssembly 和 .NET 為 iOS 和 Android 進行以下編輯(相關問題):
- 向現有方法添加靜態 lambda
- 將捕獲這個的 lambda 添加到已經有至少一個捕獲這個的 lambda 的現有方法中
- 向現有類添加新的靜態或非虛擬實例方法
- 向現有類添加新的靜態字段
- 添加新類
已知的問題:
- 不支持新增類中的實例字段
- 現有或新類中新添加的方法和字段對反射不可見
您可以在dotnet/runtime#57365中關注我們的進度
指定 .NET 7
要使用 .NET 7,您需要在項目文件中使用 .NET 7 Target Framework Moniker (TFM)。例如:
<TargetFramework>net7.0</TargetFramework>
全套 .NET 7 TFM,包括特定於操作的 TFM。
net7.0
net7.0-android
net7.0-ios
net7.0-maccatalyst
net7.0-macos
net7.0-tvos
net7.0-windows
我們希望從 .NET 6 升級到 .NET 7 應該很簡單。請報告您在使用 .NET 7 測試現有應用程序的過程中發現的任何重大更改。
結語
Microsoft 的全球多元化工程師團隊與高度參與的開發人員社區合作,正在構建 .NET 7。廣泛的 .NET 社區,包括從學生和愛好者到開源貢獻者和企業客戶的每個人,是 .NET 的核心,他們提出新想法,定期貢獻代碼,並推動 .NET 生態系統向前發展。我們感激並感謝您的支持、貢獻和見解。
歡迎使用 .NET 7。