NET 5.0正式发布,功能特性介绍(翻译)

、EFCore、C5也将在今天一同发布
您可以下载.,适用于Windows、MacOS和Linux,适用于x86、x64、Arm32和Arm64。

l安装程序和二进制文件

lDocker容器images

lLinuxpackage

l发行说明文档

l已知的问题

lGitHub问题跟踪器

贡献者

对于VisualStudio用户,您需要或更高的版本才能在Windows上使用.,在MacOS上使用最新版本的VisualStudioforMac)。VisualStudioCode的C9。

是我们的.NET统一之旅的第一个版本。我们构建.是为了让更多的开发人员能够将他们的.NETFramework代码和应用程序迁移到.。我们在5.0中也做了很多前期工作,以便Xamarin开发人员在发布.时可以使用统一的.NET平台。在后面的文章中会有更多关于.NET统一的内容。

这个版本是完全开源的第五个主要的.NET版本。现在,在GitHub上的DotNetorg中,有大量的个人和公司(包括.NETFoundation企业赞助商)作为一个大型社区在.NET的各个方面共同工作,.中的改进是许多人通过他们的努力及创新的想法构成的结果,所有这些都超出了微软对该项目的管理。为此,我们向所有为.(以及之前的版本)做出贡献的人表示“万分感谢”!
我们早在2019年5月就引入了.,当时甚至设定了2020年11月的发布日期,结果我们如期发布了,为此要感谢团队中的每一个人,是他们让这一切成为现实!2021年11月我们还将发布.,今后每年的11月我们都将发布新的.NET版本。

.亮点

在.中有许多重要的改进:

已经在和上托管了几个月,已经经过了数个月的实际测试。

l许多组件的性能都得到了极大的提高,在.中的性能改进、.中的ARM64性能和GRPC中都有详细描述。

lC5提供了新的语言改进,比如C5提供了交互式编程,.NET上函数式编程的性能得到了提升。

库增强了Json序列化、正则表达式和HTTP(、HTTP/2)的性能。

l改进了GC、分层编译和其他方面,P95延迟有所降低。

l通过ClickOnce客户端发布应用程序,单文件应用程序,减小的容器映像大小以及添加的ServerCore容器映像,应用程序部署选项更好。

lWindowsArm64和WebAssembly扩展了平台范围。

我已经为.写了很多Demo。您可以看一下这些.示例,以了解更多关于新的C9和F源代码生成器是一项重要的C9的一部分,因为它没有任何语言语法。请参阅新的C9语法并以.尝试目标。它使用顶级程序、记录、模式和切换表达式。它也已更新,以利用.NET库中完整的可为空的注释集。我们还更新了.NET物联网的文档。我们将查看该repo中的几个示例来探索C34;Let'sblinkanLED!");

usingGpioControllercontroller=new();

(pin,);

(34;Lightfor{lightTime}ms");

(pin,);

(lightTime);

(9包括对新模型的支持。您可以在如下代码中看到关于这个逻辑模式的示例。

1

2

3

4

5

6

varthreshChoice=();

();

if('Y'or'y')

{

TestThresholdAndInterrupt(ccs811);

}

另一种新模式是属性模式。您可以在我的Mycroft信息访问6.0示例中看到几个属性检查。以下代码摘自PN532RFID和NFC读取器示例。

1

2

3

4

if(pollingTypeisnot{Length:=15})

{

returnnull;

}

此代码测试pollingType(类型为byte[]?)。为空或包含15个字节。这是返回NULL之前需要测试的两个错误条件。也可以将此测试编写为pollingType为空或{Length:15}。
我想再给你看两个模型。第一个是Mcp25xxxCAN总线的逻辑模式。

1

2

3

4

5

6

publicstaticbyteGetRxBufferNumber(Addressaddress)=addressswitch

{

===0,

===1,

_=thrownewArgumentException(nameof(address),9包括一个名为Record的新类。与常规类相比,它有许多优点,其中一半与更简洁的语法有关。以下记录取自Bh1745RGB传感器绑定。

1

publicrecordChannelCompensationMultipliers(doubleRed,doubleGreen,doubleBlue,doubleClear);

然后在同一文件中稍晚一点使用它,语法很熟悉:

1

ChannelCompensationMultipliers=new(2.2,1.0,1.8,10.0);

可为空性注释的改进

现在,.NET库完全为空性添加了注释。这意味着如果您启用nullability,您将从平台获得更多类型信息来指导您使用该功能。目前,还没有对.NET文档进行完整的注释。例如,(String)应该被注释为接受一个字符串?,而(Char[])的注释是char[]?我们希望这个问题很快就能解决。完整的信息可以在上找到,也可以通过VisualStudio中的F12元数据查找获得。

和包(这两个包的版本都是1.1.0)也作为此版本的一部分进行了注释,使用了更新的.注释。这两个库都是多目标的,但是,我们使用5.0视图为所有目标生成注释。

我们还添加了新的注释类型。大型类在从构造函数调用的帮助器方法中实例化对象成员是很常见的。C的WinRT互操作程序集,这些程序集可以通过NuGet交付。这正是Windows团队正在为Windows中的WinRTAPI所做的事情。任何想要使用WinRT(在Windows上)作为互操作系统的人都可以使用该工具,以将本机API公开给.NET或将.NETAPI公开给本机代码。
CsWinRT工具在逻辑上类似于tlbimp和tlbexp,但要好得多。TLB工具依赖于.NET运行时中的大量COM互操作管道。CsWinRT工具只依赖于公共的.NETAPI。也就是说,C特性、IL链接),而这在以前的系统中不是一个选项。

l简化了.NET运行时代码库。

使用WinRTAPI不需要添加NuGet引用。以Windows10TFM为目标--刚才在.一节中已经讨论过了--已经足够了。如果您的目标是.或更早版本,则需要引用WinRT包。您可以在项目中看到此模式。
原生导出

很长一段时间以来,我们一直要求为调用.NET代码的本机二进制文件启用导出。该场景的构建块是托管对UnManagedCellersOnlyAttribute的API支持。

.NET原生导出项目使您能够:

l公开自定义本机导出。

l不需要像COM这样的更高级别的互操作技术。

l跨平台工作。

有一些现有的项目支持类似的场景,例如:

l不受管理的出口。

lDllExport

多年来,我们在本机应用程序中看到了各种.NET托管模型。@rseanHall为此提出并实现了一种新颖的新模型,该模型利用了.NET应用程序托管层提供的所有内置应用程序功能(特别是加载依赖项),同时允许从本机代码调用自定义入口点。这在很多情况下都是完美的,可以想象在从本机应用程序托管.NET组件的开发人员中变得流行起来。这在以前是不存在的。谢谢你的贡献,@rseanHall。

两个主要PR:

l启用从应用上下文调用Get_Runtime_Delegate。

l实现HDT_GET_Function_POINTER

事件管道
事件管道是我们在.中添加的一个新的子系统和API,它可以在任何操作系统上执行性能和其他诊断调查。在.中,事件管道已得到扩展,使探查器能够编写事件管道事件。此场景对于检测以前依赖ETW(在Windows上)监视应用程序行为和性能的探查器至关重要。
现在可以通过事件管道获得程序集加载信息。这一改进是使类似的诊断功能(例如FusionLogViewer)成为.NETFramework的一部分的开始。现在,您可以使用以下命令,使用Dotnet-TRACE来收集此信息:

dotnet-tracecollect--providersMicrosoft-Windows-DotNETRuntime:4:4--./MyApp–my-arg1

该工作流程在DotNet-TRACE文档中进行了说明。您可以看到简单测试应用程序的程序集加载信息。

我们对库中的控制台日志提供程序进行了改进。现在,您可以实现自定义ConsoleForMatter来完全控制控制台输出的格式化和彩色化。格式化程序API通过实现VT-100(受大多数现代终端支持)转义序列的子集来实现丰富的格式化。控制台记录器可以解析出不支持的终端上的转义序列,允许您为所有终端编写一个格式化程序。

除了对定制格式化程序的支持之外,我们还添加了一个内置的JSON格式化程序,它可以将结构化的JSON日志发送到控制台。

转储调试

调试托管代码需要了解托管对象和构造。数据访问组件(DAC)是运行时执行引擎的子集,它了解这些构造,可以在没有运行时的情况下访问这些托管对象。在Linux上收集的.NetCore进程转储现在可以在Windows上使用WinDBG或DotNetDumpAnalyze进行分析。

我们还添加了对从MacOS上运行的.NET进程捕获ELF转储的支持。由于ELF不是MacOS上的本机可执行文件格式(像lldb这样的本机调试器不能处理这些转储),我们将其作为一种选择加入的特性。要在MacOS上启用转储收集支持,请设置环境变量COMPLUS_DbgEnableElfDumpOnMacOS=1。生成的转储可以使用DotNetDumpAnalyze进行分析。

打印环境信息

随着.NET扩展了对新操作系统和芯片体系结构的支持,人们有时想要一种打印环境信息的方式。我们创建了一个简单的.NET工具来完成此任务,名为dotnet-runtimeinfo。

您可以使用以下命令安装和运行该工具。

1

2

dotnettoolinstall-fdotnet-runtimeinfo

dotnet-runtimeinfo

该工具为您的环境生成以下形式的输出。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

**.NETinformation

Version:5.0.0

FrameworkDescription:.

Librariesversion:5.0.0

Librarieshash:cf258a14b70ad9069470a108f13765e0e5988f51

**Environmentinformation

OSDescription:更改为x86/x64prolog零位调整代码。改进:JSON;TechEmpower。致谢:本·亚当斯。

l用于ARM64的Vectorise位数组-Dotnet/Runtime32270-一些(可能是大多数?)。基于改进了运行库用来存储有关泛型类型和方法的信息的低级(本机代码)字典的实现,泛型的使用现在有了更好的性能(最初的性能发现)。有关更多信息,请参见Perf:COLLECTIONCOUNT()在Core中比CLR慢。错误报告归功于@RealDotNetDave。

//Runtime25986-服务器GC(在不同线程上)现在可以工作窃取,同时标记由老一代对象持有的0/1类对象。这意味着,在某些GC线程标记时间比其他线程长得多的情况下,短暂的GC暂停会更短。

l引入固定对象堆-DotNet/Runtime27729-挂起修复减少了bgc和用户线程挂起的时间。这减少了在GC发生之前挂起托管线程所需的总时间。Dotnet/coreclr37159-GC中的矢量化标记列表排序,减少了短暂的GC暂停时间(也包括Dotnet/Runtime40322-世代感知分析,允许您确定哪些老一代对象保留在年轻一代对象上,从而使它们存活下来,并导致短暂的GC暂停时间。

l优化分解GC堆内存页面-Dotnet/Runtime2795应用了一种新的GC静态扫描方法,在确定GC堆对象的活跃度时避免了锁争用。Dotnet/Runtime34;{};{}C;{}");

}

//{"date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"temperatureF":31,"summary":"Scorching"}

publicrecordForecast(DateTimeDate,intTemperatureC,intTemperatureF,stringSummary);

这段代码很紧凑!它依赖于C34;Janeserialized:{serialized}");

EmployeejaneDeserialized=(serialized,options);

("WhetherJane'sfirstreport'smanagerisJane:");

([0].Manager==janeDeserialized);

publicclassEmployee

{

//NEW:Allowsuseofnon-publicpropertyaccessor.

//Canalsobeusedtoincludefields"per-field",ratherthangloballywithJsonSerializerOptions.

[JsonInclude]

publicstringName{get;internalset;}

publicEmployeeManager{get;set;}

publicListEmployeeReports;

publicintYearsEmployed{get;set;}

//NEW:Alwaysincludewhen(de)serializingregardlessofglobaloptions

[JsonIgnore(Condition=)]

publicboolIsManager=Reports?.Count0;

}

性能

在.中,JsonSerializer的性能得到了显著提高。StephenToub在他的.NET5帖子中谈到了JsonSerializer的一些性能改进。我还在.文章中更详细地介绍了Json的性能。

应用程序部署

在编写或更新应用程序之后,您需要部署它以使您的用户受益。这可能是到Web服务器、云服务或客户端计算机,也可能是使用AzureDevOps或GitHub操作等服务的CI/CD流的结果。
我们努力提供一流的部署功能,自然地与应用程序类型保持一致。对于.,我们专注于改进单文件应用程序,减少停靠多阶段构建的容器大小,并为使用.NETCore部署ClickOnce应用程序提供更好的支持。

容器

我们认为容器是最重要的云趋势,并在这方面投入了大量资金。我们正在以多种方式投资容器,在.NET软件堆栈的多个级别上。首先是我们对基本面的投资,这越来越多地受到容器场景和部署容器应用的开发者的影响。
我们正在让与集装箱管弦乐团的合作变得更容易。我们已经添加了OpenTelemeter支持,这样您就可以从您的应用程序中捕获分布式跟踪和指标。DotNet-monitor是一种新工具,旨在作为从.NET进程访问诊断信息的主要方式。特别是,我们已经开始构建dotnet-monitor的容器变体,您可以将其用作应用程序侧车。最后,我们正在构建DotNet/Tye,以此来提高微服务开发人员的工作效率,包括开发和部署到Kubernetes环境。
NET运行时现在支持cgroupv2,我们预计它将在2020年后成为与容器相关的重要API。Docker目前使用的是cgroupv1(已经被.NET支持)。相比之下,cgroupv2比cgroupv1更简单、更高效、更安全。您可以通过我们2019年Docker更新了解更多关于cgroup和Docker资源限制的信息。Linux发行版和容器运行时正在添加对cgroupv2的支持。一旦cgroupv2环境变得更加普遍,.将在cgroupv2环境中正常工作。这归功于OmairMajid,他在RedHat支持.NET。

作为使用“.NET”作为产品名称的一部分,我们现在将.、3.1和.镜像发布到/dotnet系列的Repos中,而不是发布到/dotnet/core。我们将继续将.和3.1双重发布到以前的位置,同时支持这些版本。.图像将仅发布到新位置。请相应地更新您的From语句和脚本。
作为.的一部分,我们将SDK镜像重新建立在镜像之上,而不是构建包-dep,以显著减小您在多阶段构建场景中拉取的聚合镜像的大小。
此更改对于多阶段构建有以下好处,其中包含一个示例Dockerfile:
的多阶段构建成本:

PullImage

Before

After

sdk:5.0-focal

268MB

232MB

aspnet:5.0-focal

64MB

10KB(manifestonly)

减少了约:100MB(-30%)

Debian10Buster的多阶段构建成本:

PullImage

Before

After

sdk:5.0

280MB

218MB

aspnet:5.0

84MB

4KB(manifestonly)

减少了约:146MB(-40%)

有关更多详细信息,请参见Dotnet/Dotnet-docker9和F9和F#5中的新语言改进应该会使您的代码更具表现力,更易于编写。对于您现有的应用程序来说,.也是一个很好的选择。在许多情况下,您可以毫不费力地升级。

在.中的改进是许多人共同努力的结果,他们在GitHub上,在世界各地,在多个时区协同工作。感谢为这一版本做出贡献的每一个人。别担心,有很多机会可以贡献自己的力量。版本已经结束,但是下一个版本已经开始了。

原文地址:

发布于 2025-05-26
115
目录

    推荐阅读