宣布 .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](https://github.com/dotnet/roslyn/blob/main/docs/Language Feature Status.md)
您可以下載適用于 Windows、macOS 和 Linux 的.NET 7 Preview 1 ,
- 安裝程式和二進制檔案
- 容器鏡像
- Linux 軟體包
- 發行說明
- 已知的問題
- GitHub 問題跟蹤器
.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
- 將一些舊式內部函式轉換為 NamedIntrinsic runtime#62271
來自@anthonycanino
- 將額外的二進制操作添加到 RangeCheck 分析中,runtime#61662
來自@SeanWoo
- [JIT] [問題:61620] 針對 *x = dblCns 優化 ARM64;runtime#61847
來自@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
- CoreRT 支持 ARM64&Unix runtime#41023
來自@weilinwa
- 基于覆寫優化 FMA 代碼生成 runtime#58196
動態 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.0net7.0-androidnet7.0-iosnet7.0-maccatalystnet7.0-macosnet7.0-tvosnet7.0-windows
我們希望從 .NET 6 升級到 .NET 7 應該很簡單,請報告您在使用 .NET 7 測驗現有應用程式的程序中發現的任何重大更改,
結語
Microsoft 的全球多元化工程師團隊與高度參與的開發人員社區合作,正在構建 .NET 7,廣泛的 .NET 社區,包括從學生和愛好者到開源貢獻者和企業客戶的每個人,是 .NET 的核心,他們提出新想法,定期貢獻代碼,并推動 .NET 生態系統向前發展,我們感激并感謝您的支持、貢獻和見解,
歡迎使用 .NET 7,
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,轉載請註明出處,本文鏈接:https://www.uj5u.com/net/427377.html
標籤:.NET Core
