官宣 .NET 7 預覽版3

語言: CN / TW / HK

本文閲讀時間:7分鐘

很高興地宣佈,我們發佈了.NET 7 預覽版3。.NET 7的第三個預覽版包括了對可觀察性、啟動時間、codegen、GC regions、本地AOT編譯等方面的增強。您現在就可以獲取並開始嘗試新功能,包括:

  • 原生 AOT

  • 默認 GC regions

  • ASP.NET Core 啟動時間改進

您可以下載適用於 Windows、macOS 和 Linux 的 .NET 7 預覽版 3。

  • 安裝程序和二進制文件

  • 容器的圖片

  • Linux包

  • 發佈説明

  • 已知的問題

  • GitHub問題跟蹤器

.NET 7預覽版3已經在Visual Studio 17.2預覽版3中進行了測試。如果您想嘗試 .NET 7和Visual Studio的系列產品,我們建議您使用預覽版。Mac版的Visual Studio暫時還未支持.NET 7預覽版,但很快就會發布。現在,讓我們瞭解這個版本中的一些最新更新的內容。

  • .NET 7 預覽版 3

    https://dotnet.microsoft.com/zh-cn/download/dotnet/7.0?ocid=AID3042760

  • 安裝程序和二進制文件

    https://dotnet.microsoft.com/zh-cn/download/dotnet/7.0?ocid=AID3042760

  • 容器的圖片

    https://hub.docker.com/_/microsoft-dotnet

  • Linux包

    https://github.com/dotnet/core/tree/main/release-notes/7.0

  • 發佈説明

    https://github.com/dotnet/core/tree/main/release-notes/7.0

  • 已知的問題

    https://github.com/dotnet/core/blob/main/release-notes/7.0/known-issues.md

  • GitHub問題跟蹤器

    https://github.com/dotnet/core/issues

  • 預覽版

    https://visualstudio.microsoft.com/vs/preview/ ?ocid=AID3042760

更快、更輕量級的原生AOT應用

.NET 7 預覽版2的博客文章中:link: ,我們宣佈原生AOT項目已經從實驗狀態轉移到.NET /runtime repo的.NET 7的主線開發中。我們知道您們中的許多人都在急切地等待着來自團隊的關於Native AOT的更新,我們在預覽版3中有一些新的更新。

如果您想了解原生AOT的詳細信息,或者想要開始使用它,repo文檔是最好的選擇。

我們也意識到您們中的一些人可能不熟悉原生 AOT是什麼,所以我們想分享它的一個快速概述給您們。

  • .NET 7 預覽版2

    https://devblogs.microsoft.com/dotnet/announcing-dotnet-7-preview-2/#nativeaot-update?ocid=AID3042760

  • repo文檔 https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/docs/compiling.md

什麼是原生AOT?

提前編譯(AOT)是指在應用程序構建時(而不是運行時)生成代碼的一系列技術。 AOT 對 .NET 來説並不陌生。 今天我們發佈了用於客户端和服務器場景的ReadyToRun,以及用於移動和WASM的Mono AOT。 原生AOT為.NET桌面客户端和服務器場景帶來了完整的原生預編譯。 原生AOT並沒有取代這些現有技術,而是提供了一組新的功能,可以解鎖新的form factors。

現有的AOT編譯的.NET程序集包含特定於平台的數據結構和本地代碼,用於通常在運行時完成的前置加載工作。預編譯這些工件可以節省啟動時的時間(例如ReadyToRun),並允許訪問非JIT平台(例如iOS)。如果沒法做預先編譯,.NET要麼退回到JIT,要麼退回到解釋(取決於平台)。

原生AOT類似於.NET現有的AOT技術,但它只生成原生artifacts。事實上,本機AOT運行時並不知道如何讀取 .NET程序集文件格式—所有這些都是平台本機的。可執行文件格式解析完全由底層操作系統處理。

原生AOT的主要優點是在啟動時間、內存使用、訪問受限平台(不允許JIT)和更小的磁盤大小方面。當操作系統將應用程序中的頁面放入內存時,應用程序就開始運行。數據結構是為了運行AOT生成的代碼而優化的,而不是為了在運行時編譯新代碼。這類似於Go、Swift和Rust等語言的編譯方式。原生AOT最適合哪些非常看重啟動時間的環境。針對原生AOT的要求比一般的.NET Core/5+應用程序和庫更嚴格。原生AOT禁止在運行時emit新代碼(例如Reflection.Emit),也禁止在運行時加載新的 .NET程序集(例如插件模型)。

  • ReadyToRun

    https://docs.microsoft.com/zh-cn/dotnet/core/deploying/ready-to-run?ocid=AID3042760

為原生AOT準備應用程序  

對於.NET 7,我們將控制枱應用和原生庫作為原生AOT的主要場景。 應用程序開發人員和庫作者現在可以通過確保他們的應用程序是可調整的來利用原生AOT。 由於剪裁是原生AOT編譯的必要條件,現在就為剪裁準備應用程序和庫將幫助它們為原生AOT做好準備。 如果您是任何一個.NET庫的作者,遵循“剪裁庫”説明將幫助你為剪裁庫和原生AOT做好準備。

我們計劃在.NET 7中發佈的一個使用原生AOT編譯的應用是Crossgen工具。 Crossgen是.NET SDK的一部分。 CoreCLR AOT編譯器生成ReadyToRun可執行文件。 Crossgen是用c#編寫的,我們目前將其編譯後作為ReadyToRun應用發佈。 在編譯速度和大小方面,我們已經看到了一些非常有前途的數字。 Crossgen從原生AOT中獲益良多,因為它是一個短暫的進程,啟動開銷主導了整個執行時間:

場景 ReadyToRun 原生AOT
編譯 CoreLib 4182 ms 3512 ms
編譯 HelloWorld 185 ms 49 ms
配置 大小
ReadyToRun 34.8 MB
原生AOT 17.6 MB

展望未來,原生AOT的兼容性將在.NET的下幾個版本中得到改善,但是在許多情況下總有理由選擇JIT。 我們還將在dotnet SDK中為使用原生AOT發佈項目添加更多的支持。

  • 原生庫

    https://github.com/dotnet/samples/blob/main/core/nativeaot/NativeLibrary/README.md

  • 應用程序和庫

    https://docs.microsoft.com/zh-cn/dotnet/core/deploying/trimming/trim-self-contained?ocid=AID3042760

  • 剪裁庫

    https://docs.microsoft.com/zh-cn/dotnet/core/deploying/trimming/prepare-libraries-for-trimming?ocid=AID3042760

可觀察性

.NET 7繼續對雲原生OpenTelemetry規範的支持。預覽版3增加了對規範升級#988和#1708的支持,使採樣器的跟蹤狀態可變。

• 允許跟蹤採樣器修改活動跟蹤狀態

//  ActivityListener 採樣回調
listener.Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) =>
{
activityOptions = activityOptions with { TraceState = "rojo=00f067aa0ba902b7" };
return ActivitySamplingResult.AllDataAndRecorded;
};
  • #988

    https://github.com/open-telemetry/opentelemetry-specification/pull/98 8

  • #1708

    https://github.com/open-telemetry/opentelemetry-dotnet/issues/1708

  • 允許跟蹤採樣器修改活動跟蹤狀態

    https://github.com/dotnet/runtime/pull/65530

System.Composition.Hosting

最新的託管可擴展性框架進行了輕微的更新,以與以前版本的API保持一致。新的API允許向System.Composition.Hosting容器添加單個對象實例。類似於遺留接口System.ComponentModel.Composition.Hosting中提供的功能以及API ComposeExportedValue(compostioncontainer, T)

建議:將現有對象注入MEF2

namespace System.Composition.Hosting
{
public class ContainerConfiguration{
public ContainerConfiguration WithExport<TExport>(TExport exportedInstance);
public ContainerConfiguration WithExport<TExport>(TExport exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
public ContainerConfiguration WithExport(Type contractType, object exportedInstance);
public ContainerConfiguration WithExport(Type contractType, object exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
}
}
  • System.Composition.Hosting容器

    https://aka.ms/containerconfiguration

  • System.ComponentModel.Composition.Hosting

    https://aka.ms/componentmodel

  • ComposeExportedValue(compostioncontainer, T)

    https://aka.ms/exportedvalue

  • 將現有對象注入MEF2

    https://github.com/dotnet/runtime/issues/29400

啟用Write-Xor-Execute後,啟動時間得到了改善 

性能仍然是.NET 7的主要關注點。dotnet/runtime#65738 PR重新實現了預編碼和調用計數存根(分級編譯助手存根),以顯著減少運行時中可執行代碼創建後修改的數量。這使得啟動時間提高了10-15%。

另外,即使沒有啟用Write-Xor-Execute,這種變化也會在一些微基準和一些ASPNet基準中帶來穩定狀態的性能提升(最高達8%)。

然而,在即將發佈的預覽版本中,也會有一些由該更改導致的迴歸(沒有啟用Write-Xor-Execute)。這是在Orchard和fortune對英特爾處理器的基準測試結果裏觀察到的。

  • dotnet/runtime#65738 PR

    https://github.com/dotnet/runtime/pull/65738

循環優化

•  對於System.Collections.Tests.Perf_BitArray. BitArrayLeftShift(尺寸:512), 循環克隆將單次調用的持續時間提高了21%。

  • 循環克隆

    https://github.com/dotnet/runtime/pull/66257

一般優化

  • 從隱藏緩衝區中返回的被調用對象中刪除額外的結構體副本

    https://github.com/dotnet/runtime/pull/64130

  • 展開String.Equals和str.StartsWith表示常量字符串

    https://github.com/dotnet/runtime/pull/65288

  • 擴展Equals/StartsWith 為OrdinalIgnoreCase自動向量化

    https://github.com/dotnet/runtime/pull/66095

  • setcc之後的Movzx優化顯示代碼大小減少了0.03 ~ 0.16%

    https://github.com/dotnet/runtime/pull/66245

GC regions默認啟用 

在預覽版 3中,默認情況下啟用了region功能,該功能有助於提高高吞吐量應用程序的內存利用率。除了MacOS和原生AOT(將來會啟用),該功能現在已在所有平台上啟用。更多細節可以訪問這個問題。

由於region最初的分配方式,我們預計較小的應用程序的工作集會增加。如果您注意到任何功能或性能差異,請在runtime repo中創建一個問題。

  • 更多細節可以訪問這個問題

    https://github.com/dotnet/runtime/issues/43844

密碼學:更好的生成X.500名稱

通過引入一個類,可以更清晰地解析X.500名稱,這一更改簡化了處理證書的工作。

讓構建x500distishedname更安全、更容易

一般來説,任何想要構建X.500名稱的人(比如用CertificateRequest類創建測試證書的人)都是通過字符串操作來實現的,要麼是通過簡單的文字,要麼是通過字符串格式化,例如:

request = new CertificateRequest($"CN={subjectName},OU=Test,O=""Fabrikam, Inc.""", ...);

這通常沒有問題,除非subjectName包含逗號、引號或任何對解析器有影響的內容。瞭解決這個問題,我們添加了x500 distishednamebuilder類。因為每個方法只對一個相對區別名(RDN)進行操作,所以解析過程中沒有歧義。另外,由於RDN標識符得到了擴展,您不再需要猜測“CN”代表什麼(“Common Name”)。

X500DistinguishedNameBuilder nameBuilder = new();
nameBuilder.AddCommonName(subjectName);
nameBuilder.AddOrganizationalUnitName("Test");
nameBuilder.AddOrganizationName("Fabrikam, Inc.");


request = new CertificateRequest(nameBuilder.Build(), ...);
  • 讓構建x500distishedname更安全、更容易

    https://github.com/dotnet/runtime/issues/44738

針對.NET 7

針對目標.NET 7,你需要在你的項目文件中使用.NET 7目標框架代號(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測試現有應用程序過程中發現的任何重大變化。

支持

.NET 7是一個當前版本,這意味着它將從發佈之日起18個月內獲得免費的支持和補丁。值得注意的是,所有版本的質量都是相同的。唯一的區別是支持的長度。有關.NET支持策略的更多信息,請參閲.NET和.NET Core官方支持策略。

  • .NET和.NET Core官方支持策略

    https://dotnet.microsoft.com/zh-cn/platform/support/policy/dotnet-core?ocid=AID3042760

重大的變化

通過閲讀.NET 7文檔中的重大的變化,你可以找到.NET 7中最新的重大變化的列表。它按區域和版本列出了重大的變更,並提供了詳細解釋的鏈接。

要查看有哪些重大的變化已經被提出來了,但是目前還是review階段,請follow.NET重大變化的github issue。

  • .NET 7文檔中的重大的變化

    https://docs.microsoft.com/zh-cn/dotnet/core/compatibility/7.0 ?ocid=AID3042760

  • 請follow.NET重大變化的github issue

    h ttps://github.com/dotnet/core/issues/7131

路線圖

.NET的發行版包括產品、庫、運行時和工具,代表了微軟內部和外部多個團隊的協作。您可以通過閲讀產品路線圖來了解更多關於這些領域的信息:

  • ASP.NET Core 7和Blazor路線圖

    https://github.com/dotnet/aspnetcore/issues/39504

  • EF 7路線圖

    https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-7.0/plan?ocid=AID3042760

  • ML.NET

    https://github.com/dotnet/machinelearning/blob/main/ROADMAP.md

  • .NET MAUI

    https://github.com/dotnet/maui/wiki/Roadmap

  • WinForms

    https://github.com/dotnet/winforms/blob/main/docs/roadmap.md

  • WPF

    https://github.com/dotnet/wpf/blob/main/roadmap.md

  • NuGet

    https://github.com/NuGet/Home/issues/11571

  • Roslyn

    https://github.com/dotnet/roslyn/blob/main/docs/Language Feature Status.md

  • 運行時

    https://github.com/dotnet/core/blob/main/roadmap.md

感謝您對.NET的所有支持和貢獻。請嘗試一下.NET 7預覽版3,告訴我們您的想法!

  • .NET 7預覽版3

    https://dotnet.microsoft.com/zh-cn/download/dotnet/7.0?ocid=AID3042760

謝謝你讀完了本文!歡迎在 評論區留言 分享你的想法,並且 轉發到朋友圈

如果你對本文青睞有加,想要轉載到自己的平台, 請在後台回覆「轉載」 與我們取得聯繫!

長按識別二維碼

關注微軟中國MSDN

.NET 7預覽版3