.NET 7 預覽版 1 發佈

.NET 7 預覽版 1 發佈

.NET 7 建立在 .NET 6 建立的基礎之上,包括一套統一的基礎庫、運行時和 SDK,簡化了開發體驗,提高了開發人員的工作效率。

最後更新 2022/2/19 上午1:01
WeihanLi amazingdotnet
預計閱讀 12 分鐘
分類
.NET
標籤
.NET C#

今天,我們很開心地宣佈 .NET 歷史上的下一個里程碑。在慶祝社群與 20 年創新的同時,.NET 7 Preview 1 標誌著邁向 .NET 下一個 20 年的第一步。

ASP.NET Core Preview 1EF7 Preview 1 也在今天發佈。

.NET 7 建立在 .NET 6 奠定的基礎之上,包括一套統一的基礎類別庫、執行階段與 SDK,簡化了開發體驗,提升了開發人員的工作效率。.NET 7 的主要關注領域包括改善對雲端原生方案的支援、更容易升級舊專案的工具,以及透過更輕鬆地使用容器來簡化開發人員體驗。

.NET 7 Preview 1 包含對 API 的可 null 性註解支援、持續的 JIT 編譯器最佳化、新的 API 以及對更多熱重載方案的支援。

.NET 版本包括產品、類別庫、執行階段與工具,代表了 Microsoft 內外多個團隊之間的合作。這篇部落格文章中涵蓋的更廣泛主題並未涵蓋 .NET 7 的所有關鍵場景與投資。它們代表了很大的領域,但只是進入 .NET 7 中所有重要工作的一部分。我們計劃對 ASP.NET Core、Blazor、EF Core、WinForms、WPF 和其他平台進行廣泛投資,您可以透過閱讀產品藍圖來了解更多關於這些領域的資訊:

您可以下載適用於 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 ServicesAzure 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 的可 null 註解

我們在為 Microsoft.Extensions.* 類別庫新增註解以實現可 null 性方面取得了進展。在 .NET 7 Preview 1 中,以下類別庫已針對可 null 性進行了註解:

  • 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.* 類別庫新增可 null 性註解。您可以查看剩餘的類別庫,並在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 將捕獲 this 的 lambda 新增到已經有至少一個捕獲 this 的 lambda 的現有方法中 向現有類別新增新的靜態或非虛擬執行個體方法 向現有類別新增新的靜態欄位 新增新類別 已知問題:

不支援新類別中的執行個體欄位 現有或新類別中新增的方法和欄位對反射不可見 您可以在 dotnet/runtime#57365 中關注我們的進度

指定 .NET 7 要使用 .NET 7,您需要在專案檔案中使用 .NET 7 Target Framework Moniker (TFM)。例如:

net7.0 全套 .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。

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2026/2/7

AOT使用經驗總結

從專案建立伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 AOT 發布測試。

繼續閱讀