今天,我们很高兴地宣布 .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 。
.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)。例如:
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。