重磅解读.NET 6 预览版 2 and 预览版 3的最新功能

最近,.NET 6发布了预览版2 和预览版3, 这两个版本带来了新的API, 运行时性能改进,.NET MAUI的早期构建,CLR类型系统的“硬件加速”(www.nipin.net)。本文章将带您探索这两个最新发布的.NET 6预览版都给.NET带来了哪些变化。

.NET Preview 2

它包括新的API,运行时性能的改进以及.NET MAUI的早期构建。它还包括了针对 Preview1中缺失的Apple Silicon的构建。在宣布完整的.NET 6版本之后,现在我们将定期安排每月的Preview,直到11月最终发布。你会在每个Preview中看到包含在 .NET6主题、史诗和用户故事中的新特性。这些主题为每个.NET应用程序包括服务器/云,桌面,物联网和移动应用程序提供了改进。

您可以下载适用于Windows,macOS和Linux的 .NET 6 Preview2

  • 安装程序和二进制文件
  • 镜像
  • Linux软件包
  • 发行说明
  • 已知的问题
  • GitHub问题追踪器

有关网络和数据访问方案的新增功能,请参见ASP.NET CoreEF Core帖子。

.NET 6已通过Visual Studio 16.9和Visual Studio for Mac 8.9进行了测试。如果您想尝试.NET 6,我们建议您使用这些版本。

在本文中,我们将着重介绍.NET开发人员提高内循环性能和使.NET具有出色的客户端应用程序开发体验这两个方面。我曾在.NET 6 Preview1文章中介绍了使用运行时 执行信息(PGO)提高启动效率和改善吞吐量

宣布完整的.NET 6版本:

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/

.NET6主题、史诗和用户故事中:

https://themesof.net/

.NET 6 Preview2

https://dotnet.microsoft.com/download/dotnet/6.0

安装程序和二进制文件

https://dotnet.microsoft.com/download/dotnet/6.0

镜像

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

Linux软件包

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

发行说明

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

已知的问题

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

GitHub问题追踪器

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

ASP.NET Core

https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-2/

EF Core

https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-6-0-preview-2/

.NET开发人员提高内循环性能

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

.NET具有出色的客户端应用程序开发体验

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

.NET 6 Preview1

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/#theme-improve-startup-and-throughput-using-runtime-execution-information-pgo

执行信息(PGO)提高启动效率和改善吞吐量

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

支持

.NET 6将在2021年11月发布,并且将作为长期支持(LTS)版本获得三年的支持。与.NET 5相比,该平台已得到显著扩展。

新增内容包括:

  • 安卓。
  • iOS。
  • Mac和Mac Catalyst,用于x64和Apple Silicon(AKA”M1”)。
  • Windows Arm64(尤其是Windows桌面)。
  • .NET 6 Debian镜像基于 当前正在测试 的 Debian 11( “bullseye”)。

长期支持(LTS)

https://github.com/dotnet/core/blob/main/release-policies.md

平台

https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0-supported-os.md

当前正在测试

https://wiki.debian.org/DebianBullseye

主题-改善.NET内部循环性能

对于所有.NET版本,性能都是最重要的。在过去的几个版本中,我们为提高吞吐量,减少内存消耗以及其他影响应用程序稳态性能的因素付出了很多努力。对于.NET 6,我们还将重点放在一些其他方面,作为.NET 6主题之一重点介绍为.NET开发人员改善内环性能。正如我们一直致力于确保应用程序和服务具有最佳性能一样,我们还希望确保开发人员能够尽可能提高工作效率,优化经常在其“内部循环”中使用的工具和工作流程。”(表示他们在进行代码更改,构建和测试的过程中反复使用的过程)。

其中一些工作看起来与过去的传统吞吐量工作非常相似,但是它们不关注稳态性能,而是关注运行时的启动性能,应用程序模型,dotnet CLI,MSBuild等,以及工具的端到端性能(特别是对于较小的解决方案,因为从历史上看,它们并没有引起足够的重视)。这种优化所涉及的思维方式通常与针对稳态吞吐量进行优化时所使用的思维方式大不相同。对于稳态工作,您可能会专注于缓存将来可以重用的值,但是对于启动性能而言,通常您会专注于只能被调用一次的操作,而第一次调用的成本很重要。但是,这里涉及的工作确实与其他许多性能工作一样,都有一个典型的profile-analyze-fix循环:您可以分析要优化的应用程序的相关区域,分析结果数据以查找最主要的违规者,并瓶颈,然后为它们提出解决方案,然后重新开始寻找下一个有影响力的项目的过程。我们仍然处于.NET 6开发周期的初期,但是我们已经成功地削减了开发人员内部循环所涉及的关键领域的开销,重点关注各种dotnet命令,例如new,build和run。迄今为止的示例改进包括:修复了放置工具非预期JIT的优化过程(dotnet / installer#9635,避免了即使未启用日志记录也进行了昂贵的日志记录相关工作(dotnet / aspnetcore#27956),优化了MSBuild中的globlob(dotnet / msbuild#6151),更改了ASP.NET Razor编译器,使用Roslyn源生成器以避免额外的编译过程(https://github.com/dotnet/sdk/pull/15756),并更改.NET主机,使用不太可能在计算机上触发防病毒工具的文件访问模式(dotnet /运行时#48774)。

当然,最佳性能优化之一是避免完全完成工作,而这正是.NET 6主题另一半的重点:.NET热重载。通过允许在运行应用程序时甚至在未连接调试器的情况下对代码进行编辑,热重装将在所有受支持的操作系统和硬件平台上提高开发人员的生产率。通过多种编辑,不需要重新启动:开发人员将保存他们的更改,并且新版本的代码将应用于执行过程。想要对应用程序或服务进行更改时,而不是需要停止它并经历典型的内部循环周期,即进行更改,构建,运行并返回到触发该需求的应用程序或服务中,对于最初的更改,可以跳过整个周期进行多种编辑。启用此功能涉及的工作横跨了.NET的版本发布。它需要在运行时(coreclr和mono)(包括C#Roslyn编译器),应用程序模型(例如Blazor,.NET MAUI)和开发人员工具(例如, ,CLI,Visual Studio)多个方面投入精力,但我们希望这能从根本上去改进.NET开发人员编写应用和服务的方式。

上面的图表演示了内循环工作的一些早期结果。

为.NET开发人员改善内环性能:

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

dotnet / installer#9635:

https://github.com/dotnet/installer/pull/9635

dotnet / aspnetcore#27956:

https://github.com/dotnet/aspnetcore/pull/27956

dotnet / msbuild#6151:

https://github.com/dotnet/msbuild/pull/6151

dotnet /运行时#48774:

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

主题:.NET具有出色的客户端应用程序开发体验

.NET 6最令人兴奋的部分之一是移动开发,目前作为单独的Xamarin产品被提供。随着时间的流逝,我们一直在使Xamarin更类似于主线.NET。现在是时候为.NET提供完全统一的移动产品了。.NET 6,iOS,Android和macOS开发将被集成到.NET SDK体验中,并使用.NET库。在过去的两年中,我们一直在努力将Mono集成到.NET中,以便开发人员可以利用这两种运行时的优势,而不必针对不同的.NET版本,也不必担心兼容性问题。在.NET 5中,我们将Blazor WebAssembly移了过来,并在Xamarin中使用了相同的模型。.NET 6是这种统一努力的大成之作,涵盖了主题的主要史诗-Xamarin开发人员可以升级到现有应用程序并使用最新的.NET SDK

现在,您所有的.NET应用程序都将在相同的库上运行,我们希望增加在台式机和移动平台上共享的代码量。Xamarin.Forms作为Xamarin的跨平台UI框架 正在演变为.NET多平台应用程序UI,使您可以使用相同的代码库轻松编写适用于iOS,Android,Windows和macOS的应用程序。.NET MAUI作为.NET 6的一部分,同时还进行了一系列性能和工具改进,例如.NET / C#Hot Reload,跨不同平台的更多共享资源和代码,以及一组更灵活的UI控件,从而提高了页面呈现性能。您可以遵循整个Epic:Xamarin / .NET MAUI开发人员提高了应用程序性能,并与.NET 6共享了更多代码

.NET MAUI不仅适用于客户端应用程序开发人员。得益于重构的控件集以及可以在.NET 6库上运行的功能,您现有的Blazor应用程序可以通过.NET MAUI在Windows和macOS上本地运行。您将能够与Blazor代码库无缝结合本机控件和功能,包括特定于平台的功能。 有关实际运行的“ Blazor桌面”的一些屏幕截图,请参见Preview1博客

我们这个主题重点关注的最后一部史诗是关于打包,部署和发布您的跨平台客户端应用程序。因为有太多应用程序的开发人员/目标平台/方式,所以最终必须分发许多不同的应用程序包。尤其是对于Blazor桌面,我们希望使体验尽可能完美。我们正在研究改善本地和云中发行和版本控制的策略,作为史诗般的台式机开发人员可以将其应用程序打包,分发,发行和更新到多个台式机平台和体系结构。

总而言之,在.NET 6中,您将能够:

  • 使用.NET库构建iOS,Android和macOS应用程序。
  • 使用.NET MAUI在相同的代码库中创建iOS,Android,Windows和macOS应用程序。
  • 跨平台共享更多代码和资源(例如图像,应用程序图标/清单等)。
  • 在macOS和Windows上本地运行Blazor Web应用程序。
  • 轻松打包和分发您包含的所有目标框架的应用程序。

我们已经取得了很大的进步,并将继续在每个.NET 6 Preview中添加更多功能。有关更多信息,您可以关注.NET MAUI Repo,该Repo与进度报告保持同步。

Xamarin开发人员可以升级到现有应用程序并使用最新的.NET SDK:

https://github.com/dotnet/xamarin/issues/2

.NET多平台应用程序UI:

https://github.com/dotnet/maui

Xamarin / .NET MAUI开发人员提高了应用程序性能,并与.NET 6共享了更多代码:

https://github.com/dotnet/xamarin/issues/21

有关实际运行的“ Blazor桌面”的一些屏幕截图,请参见Preview1博客:

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/#blazor-desktop-apps

.NET MAUI Repo:

https://github.com/dotnet/maui

.NET MAUI

我们添加了.NET MAUI和针对Android,iOS和Mac Catalyst的单个项目开发人员的经验。我们已经更新了示例存储库,其中包含您现在可以使用.NET 6 Preview2运行的项目。随着Preview的进行,越来越多的功能将被将启用。今天,您最好通过命令行来运行这些项目。

Mac Catalyst

您可以使用Mac Catalyst针对macOS桌面进行构建 ,将以下TargetFramework设置添加到项目中。

< TargetFrameworks> net6.0-android;net6.0-ios </ TargetFrameworks> < TargetFrameworksCondition= " '$(OS)' != 'Windows_NT' "> $(TargetFrameworks);net6.0-maccatalyst </ TargetFrameworks>

Mac Catalyst:

https://developer.apple.com/mac-catalyst/

一个单一的,跨平台的应用程序项目

现在,我们已经为.NET MAUI应用启用了一次项目体验。现在,您可以获得可以在Android,iOS和macOS上运行的非常干净的解决方案。Windows支持取决于WinUI 3,它现在已在其Preview中。我们将在以后的Preview中将Windows添加到.NET MAUI。有关更多详细信息,请参见导向图

如果现在需要使用此功能,请遵循示例中的指导以从命令行进行构建和运行。Visual Studio的未来版本将添加设备选择和运行选项。

导向图:

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

示例:

https://github.com/dotnet/net6-mobile-samples

共享的字体,图像和应用程序图标

字体和图像可以放置在解决方案中的一个位置,.NET MAUI将使它们能够在目标平台上本地运行。这些在您的* .csproj中作为SharedImage和SharedFont进行跟踪。

< ItemGroup> < SharedImageInclude= "appicon.svg"ForegroundFile= "appiconfg.svg"IsAppIcon= "true"/> < SharedFontInclude= "Resources\Fonts\ionicons.ttf"/> </ ItemGroup>

两者都接受通配符以包含一个位置中的所有文件。

< ItemGroup> < SharedImageInclude= "appicon.svg"ForegroundFile= "appiconfg.svg"IsAppIcon= "true"/> < SharedImageInclude= "Resources\Images*"/> < SharedFontInclude= "Resources\Fonts*"/> </ ItemGroup>

MauiApp 与Host Builder引导您的应用程序

我们具有用于配置服务,字体和兼容性渲染器以扩展Xamarin.Forms项目迁移的扩展。引入IWindow是为了在将来的版本中提供多窗口支持。这种新模式还为库作者和控件供应商提供了一个统一的地方,可与.NET MAUI集成。

publicclassApplication: MauiApp{publicoverrideIAppHostBuilder CreateBuilder( ) => base.CreateBuilder .RegisterCompatibilityRenderers.ConfigureServices((ctx, services) =>{services.AddTransient<MainPage>;services.AddTransient<IWindow, MainWindow>;}).ConfigureFonts((hostingContext, fonts) =>{fonts.AddFont( "ionicons.ttf", "IonIcons"); });

publicoverrideIWindow CreateWindow( IActivationState state) {Microsoft.Maui.Controls.Compatibility.Forms.Init(state);returnServices.GetService<IWindow>; }}

新的控件Handlers

我们已经介绍了实现新的Handlers方法的第一个控件和属性。这些包括Button,Label和Entry,Slider和Switch的部分实现。

HelloMaui示例应用程序现在从单个项目运行到macOS,iOS和Android,其中展示了当前已移植的控件集。

macOS:

IOS:

安卓:

HelloMaui示例应用程序:

https://github.com/dotnet/net6-mobile-samples

移动SDK的更新

在此版本中,移动SDK和相关的工具也有此功能。这些功能将与将来的Visual Studio发行版集成在一起,并将继续得到改进。

安卓:

  • Android X库现已可用于.NET 6,并且是Android应用程序的默认依赖项

iOS:

  • Windows上的开发人员可以使用远程iOS模拟器
  • Windows上的开发人员可以连接到远程Mac构建主机
  • 添加了提前编译,可用于构建和部署到物理iOS硬件

.NET 库

.NET库中已添加了以下API和改进。

System.Text.Json – ReferenceHandler.IgnoreCycles

JsonSerializer(System.Text.Json)现在支持在 序列化对象图时忽略循环的功能。ReferenceHandler.IgnoreCycles选项的行为与 Newtonsoft.Json ReferenceLoopHandling.Ignore相似。一个主要区别是System.Text.Json实现使用空JSON令牌替换了引用循环,而不是忽略对象引用。

在下面的示例中,您可以看到ReferenceHandler.IgnoreCycles的行为。在这种情况下,Next属性将序列化为null,否则会创建一个循环。

classNode{publicstringDeion { get; set; } publicobjectNext { get; set; } }

voidTest( ) {varnode = newNode { Deion = "Node 1"}; node.Next = node;

varopts = newJsonSerializerOptions { ReferenceHandler = ReferenceHandler.IgnoreCycles };

stringjson = JsonSerializer.Serialize(node, opts); Console.WriteLine(json); // Prints {"Deion":"Node 1","Next":null}}

JsonSerializer(System.Text.Json):

https://docs.microsoft.com/en-gb/dotnet/api/system.text.json.jsonserializer?view=net-5.0

序列化对象图时忽略循环的功能:

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

Newtonsoft.Json ReferenceLoopHandling.Ignore相似:

https://www.newtonsoft.com/json/help/html/ReferenceLoopHandlingIgnore.htm

PriorityQueue

PriorityQueue <TElement,TPriority>(System.Collections.Generic)是一个新集合,可以添加具有值和优先级的新项目。出队时,PriorityQueue返回具有最低优先级值的元素。您可以认为这个新集合类似于Queue <T>,但是每个排队的元素都有一个优先级值,该值会影响出队的行为。下面的示例演示PriorityQueue <string,int>的行为。

// creates a priority queue of strings with integer prioritiesvarpq = newPriorityQueue< string, int>;

// enqueue elements with associated prioritiespq.Enqueue( "A", 3); pq.Enqueue( "B", 1); pq.Enqueue( "C", 2); pq.Enqueue( "D", 3);

pq.Dequeue; // returns "B"pq.Dequeue; // returns "C"pq.Dequeue; // either "A" or "D", stability is not guaranteed.

感谢社区成员 Patryk Golebiowski为该部分功能的实现所做出的 贡献

Patryk Golebiowski:

https://github.com/pgolebiowski

贡献:

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

更好地解析标准数字格式

我们针对标准数字类型(尤其是.ToString和.TryFormat)改进了解析器。当指定精度> 99个小数位时,它们将提供更好的结果。而且,解析器现在可以更好地支持Parse方法中的数字尾部随零。

下面的示例演示行为之前和之后。

• 32 .ToString(“ C100”) -> C132.NET6:32 .0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

.NET 5:格式化代码中存在人为限制,只能处理<= 99的精度。对于> = 100的精度,我们将输入解释为自定义格式。

· 32.ToString(“ H99”)->引发FormatException

.NET 6:引发FormatException

这是正确的行为,但在此处调用它是为了与下一个示例形成对比。

· 32.ToString(“ H100”)-> H132

.NET 6:抛出FormatException

.NET 5:H是无效的格式说明符。因此,我们应该抛出FormatException。相反,我们将精度> = 100解释为自定义格式的错误行为意味着我们返回了错误的值。

变化:

  • https://github.com/dotnet/runtime/issues/46827
  • https://github.com/dotnet/docs/pull/23046
  • https://github.com/dotnet/docs/issues/22458

SignalR –可为空注解

ASP.NET Core SignalR Client软件包被注释了可为空性。这意味着,当您 启用空值功能时,C#编译器将根据对SignalR API中的空值处理提供适当的反馈。SignalR服务器已针对5.0中的可为空性进行了更新,但在6.0中进行了一些修改。您可以在 dotnet / aspnetcore#27389上跟踪ASP.NET Core对可为空的注解的支持。

可空注解是.NET Core 3.x和.NET 5发行版的重点。所有.NET库(也称为“基类库”)都作为这些发行版的一部分进行了注解。System.Device.Gpio程序包也作为.NET 5版本的一部分进行了注解。

您需要在项目文件中添加<Nullable> enable </ Nullable>才能使用可为空的注解。

运行

.NET运行时已进行了以下改进(或与之相关)。

ASP.NET Core SignalR Client:

https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Client/

可为空性:

https://github.com/dotnet/aspnetcore/pull/29219

启用空值功能:

https://docs.microsoft.com/en-gb/dotnet/csharp/language-reference/builtin-types/nullable-value-types

dotnet / aspnetcore#27389:

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

System.Device.Gpio:

https://www.nuget.org/packages/System.Device.Gpio/

框架程序集使用Crossgen2进行编译

更新:此更改(使用 crossgen2编译了更多程序集)并未将其纳入 Preview2,但将成为Preview3的一部分。

现在,所有.NET库都使用crossgen2跨所有受支持的操作系统和体系结构进行编译。这包括Microsoft.NETCore.App目录中的所有库,但不包括其他框架,例如ASP.NET或Windows桌面。这些框架将在Preview3和/或4中过渡到Crossgen2。

Crossgen2本身并非旨在提高性能。正如我在Preview1帖子中所说的那样,Crossgen2的目的是启用新的性能功能,例如PGO。就是说,Crossgen2基于一些针对性的大小优化提供了在磁盘上适度大小的改进,如下面的比较所示。要点是转移到Crossgen2不会引起任何前期回归。正如所承诺的那样,它实际上是中立的。

Size[MB]FullName-----------------64 .22C:ProgramFilesdotnetsharedMicrosoft.NETCore.App5.0.363 .31C:ProgramFilesdotnetsharedMicrosoft.NETCore.App6.0.0-preview.1.21102.1263 .00C:ProgramFilesdotnetsharedMicrosoft.NETCore.App6.0.0-preview.2.21118.6

crossgen2:

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/#crossgen2:

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/#crossgen2

Preview1

PGO:

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/#theme-improve-startup-and-throughput-using-runtime-execution-information-pgo

配置文件引导的优化

概要文件引导的优化使我们能够生成基于各种特征的最佳代码。我们正在构建静态和 动态PGO变体。

Preview2中进行了以下改进:

  • 允许CSE和提升间接表的vtable查找 -dotnet / runtime#47808
  • 分层编译中的块计数- dotnet /运行时#13672
  • 允许内联配置文件按比例缩放-dotnet /运行时#48280
  • 有效的配置方案(例如,具有有效边缘检测功能的指令)- dotnet /运行时#46882,dotnet /运行时#47509,dotnet /运行时#47476,dotnet /运行时#47072,dotnet /运行时#47597,dotnet /运行时#47723, dotnet /运行时#47876,dotnet /运行时#47959

概要文件引导:

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/#theme-improve-startup-and-throughput-using-runtime-execution-information-pgo

动态PGO:

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

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

dotnet / runtime#47808:

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

dotnet /运行时#13672:

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

dotnet /运行时#46882,dotnet /运行时#47509,dotnet /运行时#47476,dotnet /运行时#47072,dotnet /运行时#47597,dotnet /运行时#47723, dotnet /运行时#47876,dotnet /运行时#47959:

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

JIT 改进

为了优化JIT生成的代码,进行了以下改进。

非对齐的克隆循环— dotnet /运行时#48090

MultiplyHigh内置函数(smulh / umulh)— dotnet /运行时#47362

第一项改进是 稳定性能测量的项目的最新结果。您可以阅读最近的分析( 2021年1月26日2021年2月3日),这些分析提供了我们进展的深入解释。

第二项改进特定于Arm64。我们将与Arm工程师合作, 继续提高JIT为Arm64生成的代码性能

.NET Preview 3

此版本几乎完全致力于底层性能特性。这种改进一般很难让人有兴趣,但它们对许多应用帮助很大。这些改进大多直接应用于 CLR 类型系统,要么使其更快,要么更好地与现代 CPU 相互作用(可以理解为"有硬件加速的类型系统")。在过去几年中,在 .NET 中出现了一些关键性能趋势,包括:在库中更自由地使用结构,以及将运行时间代码移动到 C#。在这些变化中,这两种趋势都是可见的(直接或间接的)。

您可以下载. NET 6预览版3用于Windows、macOS和Linux。

  • 安装程序和二进制文件
  • 容器镜像
  • Linux 包
  • 发行说明
  • 已知问题
  • Github问题跟踪

有关 Web 技术的新增内容,请参阅 ASP.NET Core的帖子。对于 EF Core, 预览 3包括多个错误修复和基础架构的持续改进,以支持即将推出的功能,包括编译的模型和临时表

.NET 6 已通过Visual Studio 16.10 预览 1 和 Mac 8.9 的Visual Studio进行测试。如果你想尝试.NET 6,我们建议您使用这些版本

对于Linux用户:.NET SDK 6 预览 3 解决了 NuGet 在 Linux 上restore失败的问题,原因是 NuGet 证书过期,并且不幸地与 Linux 上的根证书store进行了更改,这些更改由 ca 证书和 nss 包进行。请尽快更新您的 .NET 5和.NET 6 SDK部署。

dotnet /运行时#48090:

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

dotnet /运行时#47362:

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

稳定性能测量:

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

2021年1月26日:

2021年2月3日:

继续提高JIT为Arm64生成的代码性能:

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

下载. NET 6预览版3:

https://dotnet.microsoft.com/download/dotnet/6.0

安装程序和二进制文件:

https://dotnet.microsoft.com/download/dotnet/6.0

容器镜像:

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

Linux 包:

https://github.com/dotnet/core/blob/main/release-notes/6.0/install-linux.md

发行说明:

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

已知问题:

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

Github问题跟踪:

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

ASP.NET Core的帖子:

https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-3/

预览 3:

https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/6.0.0-preview.3.21201.2

NuGet 在 Linux 上restore失败:

https://devblogs.microsoft.com/nuget/net-5-nuget-restore-failures-on-linux-distributions-using-nss-or-ca-certificates/

.NET 5:

https://devblogs.microsoft.com/dotnet/net-april-2021-updates/

支持

.NET 6 将于2021 11 月发布,并将作为长期支持LTS版本提供三年的支持。支持的平台已显著扩展。

新增的有:

  • Android.
  • iOS.
  • Mac 和 Mac Catalyst, 用于 x64 和Apple Silicon ( AKA "M1" )。
  • Windows Arm 64 (特别是Windows Desktop)。

.NET 6 Debian容器镜像是基于Debain 11("Bullseye"),目前正在测试中

长期支持 (LTS) 版本:

https://github.com/dotnet/core/blob/main/release-policies.md

支持的平台:

https://github.com/dotnet/core/blob/main/release-notes/6.0/supported-os.md

目前正在测试中:

https://wiki.debian.org/DebianBullseye

以下ABI 和改进已添加到.NET 库中。

更快地处理字典中的结构体

一个新的 不安全 的 api-CollectionsMarshal.GetValueRefOrNullRef- 已被添加,更新字典当中的的结构体将会更快。新的API 适用于高性能场景,而不是用于一般用途。它返回一个结构体的ref,然后可以用典型的技术进行更新.

在此更改之前,更新字典值对于高性能场景来说可能非常昂贵,需要字典查找和该结构体的栈拷贝:然后在更改后,它需要再次分配到字典密钥,导致另一个查找和复制操作。此改进将密钥哈希减少到1(从2),并删除所有结构体拷贝操作。

例:

refMyStruct value= refCollectionsMarshal.GetValueRefOrNullRef(dictionary, key); // Returns Unsafe.NullRef<TValue> if it doesn't exist; check using Unsafe.IsNullRef(ref value)if(!Unsafe.IsNullRef( refvalue)) {// Mutate in-placevalue.MyInt++;

CollectionsMarshal.GetValueRefOrNullRef:

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

更快的接口检查和转换

接口转换性能提高了16% - 38%。此改进对于C#接口之间的模式匹配非常有用

接口 方法

接口实现

耗时

版本

优化比例

改进

IsInterface1

Interface1

2.166 ns

.NET 6 预览版2

1.000

IsInterface1

Interface1

1.629 ns

.NET 6 预览版3

0.752

x1.3

IsNotImplemented

Interface1

2.166 ns

.NET 6 预览版2

1.000

IsNotImplemented

Interface1

1.950 ns

.NET 6 预览版3

0.900

x1.1

IsInterface1

Interfaces6

2.155 ns

.NET 6 预览版2

1.000

IsInterface1

Interfaces6

1.936 ns

.NET 6 预览版3

0.898

x1.1

IsInterface1

Interfaces6

2.161 ns

.NET 6 预览版2

1.000

IsInterface1

Interfaces6

1.908 ns

.NET 6 预览版3

0.883

x1.1

IsInterface1

Interfaces6

2.188 ns

.NET 6 预览版2

1.000

IsInterface1

Interfaces6

1.672 ns

.NET 6 预览版3

0.764

x1.3

IsInterface1

Interfaces6

2.346 ns

.NET 6 预览版2

1.000

IsInterface1

Interfaces6

1.965 ns

.NET 6 预览版3

0.838

x1.2

IsInterface1

Interfaces6

3.122 ns

.NET 6 预览版2

1.000

IsInterface1

Interfaces6

2.173 ns

.NET 6 预览版3

0.696

x1.4

IsInterface1

Interfaces6

3.472 ns

.NET 6 预览版2

1.000

IsInterface1

Interfaces6

2.687 ns

.NET 6 预览版3

0.774

x1.3

IsNotImplemented

Interfaces6

3.644 ns

.NET 6 预览版2

.NET 6 预览版3。NET 6 预览版2

1.000

IsNotImplemented

Interfaces6

3.071 ns

NET 6 预览版3

0.843

x1.2

将 .NET 运行时间的一部分从C++移动到托管 C#的最大优势之一是它降低了对.NET运行时做出贡献的难度。这包括早期C#在.NET 6中的更改中就存在的接口转换。在.NET生态系统中,用C#的要比用C++的人多得多(而且运行时间甚至不是常规的C++)。仅仅是能够读懂一些运行时的代码就足以培养出对.NET运行时做贡献的信心。

接口转换性能提高了:

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

降低了对.NET运行时做出贡献的难度:

运行时:代码生成

以下更改可提高RyuJIT 中的代码生成,从而提高进程的效率,或使生成的代码运行速度更快。

优化:

  • 检查 Length 后移除边界检查(https://github.com/dotnet/runtime/pull/40180)
  • Span 边界检查省略和顶层范围检查节点移除(https://github.com/dotnet/runtime/pull/49271)
  • 支持字节数组访问的循环克隆(https://github.com/dotnet/runtime/pull/48894)
  • JIT:非空ThrowHelpers(https://github.com/dotnet/runtime/pull/48589)
  • 浮点数常数 CSE(https://github.com/dotnet/runtime/pull/44419)
  • 为不可变静态只读字段启用 CSE 和循环不变式提升优化(https://github.com/dotnet/runtime/pull/44562)
  • 折叠空字符串常量检查(https://github.com/dotnet/runtime/pull/49930)
  • 消除没有 GC 字段的被跟踪临时内存的零初始化(https://github.com/dotnet/runtime/pull/49879)

动态 PGO :

  • 更新返回合并和尾调用的 profile (https://github.com/dotnet/runtime/pull/48773)
  • 类配置文件:使用未知占位符进行收藏类类型处理(https://github.com/dotnet/runtime/pull/48707)

在寄存器中保留结构体

  • 彻底的结构体改进 第 1 部分:创建更多LCL_FLD(https://github.com/dotnet/runtime/pull/48377)
  • 提高"STORE_BLK(lcl_var)"的生存性(https://github.com/dotnet/runtime/pull/48797)

完成. NET 6 异常处理

  • JIT:默认情况下启用(https://github.com/dotnet/runtime/issues/35923)
  • 将单定义的异常处理器放入寄存器(https://github.com/dotnet/runtime/pull/47307)
  • 7~18%性能提升(https://github.com/DrewScoggins/performance-2/issues/4275)

工具:.NET热重载对Web应用初步可用

对.NET热重载的早期支持现在可用于 ASP.NET Core和Blazor项目,只需要运行dotnet watch就可以启用。NET 热重载将代码更改应用到正在运行的应用中,而无需重新启动它,并且不会丢失任何应用状态。无法应用于运行中的应用的代码更改仍可以通过重建和重新启动应用来应用。

这只是我们更全面的计划的第一步,将这项技术带给所有.NET开发人员,包括桌面(WPF、WinUI、WinForms)、.NET MAUI 中的跨平台客户端场景等。.NET热重装将在.NET 6的未来预览版中与这些附加平台一起支持。此外,我们还将在未来的Visual Studio发布中提供对 .NET 热重载的支持。

有关尝试使用 Web 应用项目进行热重新加载的更多详细信息,请参阅 .NET 6 预览 3 中的 ASP.NET Core更新

.NET 6 预览 3 中的 ASP.NET Core更新:

https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-3/

尾声

我们现在大约在.NET 6最终版本开发进程的一半,至少在功能开发方面是这样。我们预计,在开始关注发布候选版本的质量之前,一些更大的功能将在接下来的几个预览版中登陆。我们非常期待您的反馈,请给我们留言。

主营产品:蒸汽发生器