.NET 6预览5

2021-06-18 22:34:55

我们很激动到释放.NET 6预览5.我们现在在.NET 6的下半部分,并开始看到有重大的功能。一个很好的例子是.NET SDK工作负载,它是我们的.NET Unifigation Vision的基础,并支持支持更多的应用程序类型。与其他特征一样,它即将到来提供引人注目的最终用户体验。

有关Web,数据访问和跨平台UI方案的最新功能,请参阅ASP.NET核心,EF核心和.NET MAUI帖子。

Visual Studio 2022预览1今天也释放,.NET 6预览5包含在该版本中。 .NET 6也使用Visual Studio 16.11和Mac 8.9的Visual Studio进行了测试。我们建议您使用这些构建,如果您想尝试使用Visual Studio .NET 6。

查看新的对话帖子,用于深入的工程师到工程师讨论最新.NET功能。

SDK Workloads是一个新的.NET SDK功能,使我们能够为新的应用程序类型添加支持 - 如移动和网页装配 - 而不增加SDK的大小。

工作负载功能已更新为包含列表和更新动词。这些新功能提供了预期的最终经验的感觉。您将能够用一些简单的命令快速建立您的首选环境,并随着时间的推移保持最新状态。

更新动词查询nuget.org for更新的工作负载清单,更新本地清单,下载已安装工作负载的新版本,然后删除所有旧版本的工作负载。这类似于APT更新和APT升级 - 即(基于Debian的Linux Distrs)。

Dotnet Workload命令在给定SDK的上下文中运行。想象一下,您已安装.NET 6和.NET 7。如果您使用两者,工作负载命令将提供不同的结果,因为工作负载将是不同的(至少不同版本的相同工作负载)。

如您所见,工作负载功能本质上是.NET SDK的包管理器。工作负载首先在.NET 6预览4释放中引入。

包验证工具将使Nuget库开发人员能够验证其软件包是否一致且形成良好。

验证程序包对所有特定于运行时的实现具有相同的公众API。

在.NET 5中,我们将大约250分析仪与.NET SDK发布了大约250分析仪。他们中的许多已经存在,但是被带出乐队作为尼古特包。我们为.NET 6添加了更多分析仪。

默认情况下,大多数新分析仪都在信息级别启用。您可以通过配置这样的分析模式来在警告级别启用这些分析仪:< anyysismode> allenelabledydefault< / analysismode&gt ;.

我们发布了我们想要的.NET 6(加上一些额外)的分析仪集,然后使大部分抢劫抢。

Credit到Newell Clark和Meik Tranel的以下实施中包含的预览5.请注意,社区在以前的预览中贡献了其他实施。

CA1416平台兼容性分析仪已经使用操作系统/运行时的方法识别平台警卫,例如operatingSystem.IsWindows和Operatingsystem.IsWindowsVersionAtlest。但是,分析仪不识别出类似于在字段或属性中缓存的平台检查结果等其他保护可能性,或者在辅助方法中定义复杂的平台检查逻辑。

为了允许自定义保护可能性,我们添加了新的属性支持oSplatformGuard和UnsupportedOsplatformGuard,用于使用相应的平台名称和/或版本注释自​​定义警卫成员。该注释由平台兼容性分析仪的流分析逻辑识别和尊重。

[Unsupportedosplatformguard("浏览器")] //平台保护属性 #if target_browser. 内部BOOL isporpported =>错误的; #别的 内部BOOL isporpported =>真的; #万一 [UnsupportedoSplatform("浏览器")] void apinotsupportedonbrowser(){} void m1() { apinotoupportedonbrowser(); //警告:所有平台可访问此呼叫站点。' apinotoupportedonbrowser()'不支持:'浏览器' 如果(签发) { apinotoupportedonbrowser(); //不警告 } } [支持DOSPLATFORM(" Windows")] [SupportedOsplatform(" Linux")] void apionlyworkonwindowslinux(){} [SupportedOsplatformGuard(" Linux")] [SupportedOsplatformguard(" Windows")] 私有readonly bool _iswindoworlinux = operatingsystem.Islinux()|| Operatingsystem.IsWindows(); void m2() { apionlyworkonwindowslinux(); //此呼叫站点可以在所有平台上访问。' apionlyworkonwindowslinux()'只支持:' Linux&#39 ;,' windows' if(_iswindoworlinux) { apionlyworkonwindowslinux(); //不警告 } } }

您现在可以为具有Application.SetDefaultFont的应用程序设置默认字体。您使用的模式类似于设置高DPI或视觉样式。

班级计划 { [Stathread] 静态void main() { application.sethighdpimode(highdpimode.systemaware); application.enablevisualstyles(); application.setcompatibletextrenderingdefault(false); + application.setdefaultfont(新字体(新的fontfamily(" Microsoft Sans Serif"),8f)); application.run(新form1()); } }

默认字体在.NET Core 3.0中更新。但是,这一变化引入了一些用户迁移.NET Framework应用程序到.NET核心的重要障碍。这种新的变化使得为应用程序选择所需的字体并删除该迁移障碍。

从包裹中删除框架是一个源头破裂的变化。与此同时,继续为我们发货的所有框架构建增加了包的复杂性和大小。在过去,我们通过收获解决了这个问题,基本上意味着:

在构建过程中,我们下载了早期版本的包并收集了早期框架的二进制文件,我们不再为

虽然这意味着您可以随时更新,而无需担心我们会丢弃框架,这也意味着如果您使用收获的二进制文件,您将永远不会收到任何错误修复或新功能。换句话说,收获的资产无法维修,现在隐藏,因为从你的角度来看,你能够继续将包装更新到以后的版本,甚至认为你正在消耗我们不再的同样的旧二元包更新。

从.NET 6预览5开始,我们计划不再执行任何形式的收获,以确保我们运送的所有资产都可以提供服务。这意味着我们正在为任何比这些框架的框架丢弃支持:

如果您当前正在引用从早期框架中引用受影响的包,则您将不再能够将引用的包更新为更高版本。您的选择要么将项目重新出口到稍后的框架版本或未更新引用的包(通常不是巨大的收回,因为您已经消耗了冻结的二进制文件)。

有关更多详细信息,请参见“受影响的软件包的完整列表”,请参阅DotNet /公告:丢弃旧框架版本。

我们一直在改善Microsoft.extensions API此版本。在预览5中,我们专注于托管和依赖注入。在预览4中,我们添加了一个用于日志记录的编译时源生成器。

我们在ihostbuilder上添加了一个新的ConfigureHostOptions API,使应用程序设置更简单(例如,配置关机超时):

使用hostbuilder host = new() .configureServices(服务=> { 服务.Configure< hostoptions>(o => { o.shutdowntimeout = timespan.fromminutes(10); }); }) 。建造(); host.run();

您可能已经注意到服务提供商的处理将在碰巧注册IASyncDisposable服务时抛出InvalidOperationException。

新的CreateAsyncope API提供了一个简单的解决方案,您可以在以下示例中看到:

使用系统; 使用system.threading.tasks; 使用Microsoft.extensions.DependentIn注意; 等待使用var提供程序= new serviceCollection() .addscoped< foo>() .buildserviceprovider(); //这个使用可以抛出InvalidOperationException 使用(var scope = provider.createscope()) { var foo = scope.serviceprovider.getrequiredservice< foo>(); } flass foo:iasyncdisposable { Public ValueTask DisposeAsync()=>默认; }

几乎所有.NET Serializers的骨干都是反射。反射是某些场景的重要功能,但不是作为高性能云天然应用的基础(通常(de)序列化和处理大量的JSON文件)。反射是启动,内存使用和装配修剪的问题。

运行时反射的替代方案是编译时源生成。源生成器生成可以编译为库或应用程序构建的一部分的C#源文件。在编译时生成源代码可以为.NET应用程序提供许多好处,包括改进的性能。

在.NET 6中,我们包括一个新的源生成器作为System.Text.json的一部分。 JSON源生成器与JSonserializer配合使用,并且可以以多种方式配置。是你决定你是否使用新的源生成器。它可以提供以下好处:

例如,而不是在运行时在运行时动态生成方法以在(de)序列化期间使用反射(使用私有内存并具有启动成本),而不是在(de)序列化期间设置类属性,而是可以生成更简单且有效地分配的代码或者直接检索到闪电快速闪电的属性。

您可以使用system.text.json nuget包的最新预览版本尝试源生成器。我们正在致力于在SDK内包括源生成器的提案。

默认情况下,JSON源生成器为给定的序列化类型发出序列化逻辑。通过生成直接使用UTF8JSONWRITER的源代码,可以提供比使用现有的JSonserializer方法更高的性能。简而言之,源生成器提供了一种在编译时向您提供不同实现的方式,以便更好地使运行时体验。

缩放,JSonserializer是一个强大的工具,具有许多功能(甚至更新!),可以从/进入JSON格式的.NET类型的(DE)序列化。它很快,但是当序列化例程只需要一个功能子集时可以具有一些性能开销。前进,我们将更新JSonserializer和新源生成器一起。

命名空间测试 { 内部类jsonmessage. { 公共字符串消息{get;放; } } }

源生成器可以配置为为示例jsonMessage类型的实例生成序列化逻辑。请注意,jsoncontext类名称是任意的。您可以使用所生成的源您想要的任何类名。

使用system.text.json.serialization; 命名空间测试 { [JSonserializable(Typeof(jsonMessage)] 内部部分类jsoncontext:jsonserializercontext { } }

我们已经定义了一组通过JSonserializerOptionsAttribute提供了一系列支持源生成模式的JSonserializer功能,该功能提供了最佳的序列化吞吐量。这些功能可以提前指定给源生成器,以避免在运行时额外检查。如果未使用该属性,则在运行时假定默认的JSonserializationOptions。

作为构建的一部分,源生成器通过以下形状增强了jsonContext部分类:

内部部分类jsoncontext:jsonserializercontext { 公共静态jsoncontext默认{get; } 公共jsontypeinfo< jsonmessage> jsonmessage {得到; } 公共jsoncontext(JSonserializerOptions选项){} 公共覆盖jsontypeinfo gettypeinfo(类型类型)=> ...... }

使用此模式的串行程序调用看起来像以下示例。此示例提供了最佳性能。

使用hememstream ms = new(); 使用utf8jsonwriter writer = new(ms); jsoncontext.default.jsonmessage.serialize(写道,新jsonmessage {"你好,世界!"}); 撰写者.Flush(); // Writer包含: // {"消息":"你好,世界!"}

或者,您可以继续使用JSonserializer,而是将生成的代码的实例与JsonContext.default.jsonMessage传递给它。

这两个过载之间的差异是第一个使用键入的元数据实现 - jsontypeinfo< t> - 第二个是使用更普遍的UNTYWED实现,该实现可以在上下文实例中确定是否存在键入的实现。结果,它有点慢(由于类型测试)。如果没有给定类型的源生成的实现,则erializer会抛出令人效归的泄漏。它不会回到基于反射的实现(作为明确的设计选择)。

基于UTF8JSONWWRITER的最快和最优化的源代生成模式 - 目前仅适用于序列化。类似于反序列化的支持 - 基于UTF8JSONREADER - 可以根据您的反馈提供将来提供。

但是,源生成器还会发出可以效益反序列化的类型元数据初始化逻辑。要使用预先生成的METADATA反常化JSONMESSAGE的实例,您可以执行以下操作:

可以在派生的,部分jsonserializercontext实例上通过[JSonserializable]源代码生成多种类型,而不是一个。

源生成器还支持对象上的嵌套对象和集合成员,而不仅仅是原始类型。

压缩对于通过网络传输的任何数据非常重要。 WebSocket现在启用压缩。我们使用了WebSockets,RFC 7692的Permessage-Leflate扩展的实现。它允许使用缩小算法压缩WebSockets消息有效载荷。

此功能是GitHub上网络的顶级用户请求之一。您可以通过API评论1和API评论提供API,遵循我们的旅程1和API评论2。

我们意识到,使用压缩与加密一起可能导致攻击,如犯罪和违规行为。这意味着不能在单个压缩上下文中与用户生成的数据一起发送秘密,否则可以提取秘密。为了让用户注意这些影响,并帮助他们权衡风险,我们将API更名为危险的DeflateOptions。我们还添加了关闭特定消息的压缩的能力,因此如果用户想要发送秘密,它们可以在没有压缩的情况下安全地执行此操作。

IVAN还有一个随访,减少了当压缩禁用约27%时Websocket的内存占用空间。

从客户端启用压缩很容易,请参阅下面的示例。但是,请记住,服务器可以协商设置,例如,请求较小的窗口,或完全拒绝压缩。

var cws = new clientwebsocket(); cws.options.dangereDeflateOptions = new websocketDeflateOptions() { clientmaxwindowbits = 10, servermaxwindowbits = 10. };

最近还添加了对ASP.NET核心的WebSocket压缩支持。它将包含在即将推出的预览中。

袜子是一个代理服务器实现,可以处理任何TCP或UDP流量,使其成为一个非常通用的系统。它是一个已添加到.NET 6的长期社区请求。

此更改为Socks4,Socks4a和Socks5增加了支持。例如,它可以通过SSH测试外部连接或连接到TOR网络。

WebProxy类现在接受Socks方案,就像在以下示例中所看到的那样。

var handler = new httpclienthandler { Proxy =新的WebProxy(" Socks5://127.0.0.1",9050) }; var httpclient = new httpclient(handler);

我们一直在为上一对夫妻.NET版本添加对OpenTeLemetry的支持,作为我们对可观察性的关注的一部分。在.NET 6中,我们正在为OpenTeLemetry指标API添加支持。通过为OpenTeMetry添加支持,您的应用可以与其他OpenTeLemetry系统无缝互操作。

system.diagnostics.metrics是OpenTeleMetry指标API规范的.NET实现。指标API明确地设计用于处理原始测量,通常有意图,有效和同时产生这些测量的连续摘要。

API包括仪表类,可用于创建仪器对象(例如计数器)。 API公开了四种仪器类:计数器,直方图,观察到和观察奖励,以支持不同的指标方案。此外,API公开了MeterListener类以允许监听仪器的录制测量以获取聚合和分组目的。

OpenTeLemetry .NET实现将扩展为使用这些新的API,它为度量标准可观察性方案添加了支持。

米计=新仪表(" io.opentelemetry.contrib.mongodb&#34 ;," v1.0"); 计数器< int>计数器= meter.createcounter< int>("请求"); 逆报署(1); counter.add(1,keyvaluepair.Create< String,Object>("请求""阅读"));

meterlistener listener = new meterlistener(); listener.instrumentpublished =(仪器,meterlistener)=> { if(internice.name =="请求"&&&&&&&& name .name ==" io.opentelemetry.contrib.mongodb") { meterlistener.enablemeasurementEvents(仪器,null); } }; listener.setmeasurementEventCallback< int>((仪器,测量,标签,状​​态)=> { console.writeline($" interner:{interner.name}录制了测量{measurement}"); }); listener.start();

从十进制和十六进制字符串中解析了分析来自十进制和十六进制字符串。我们看到高达89%的改善,如下图所示。

向量< t>现在支持在C#9中添加的nint和nuint原始类型。例如,此更改应使其更简单地使用带有指针或平台依赖的长度的SIMD指令。

.NET加密API支持使用OpenSSL 3作为Linux上的首选本机加密提供程序。 .NET 6如果可用,将使用OpenSSL 3。否则,它将使用OpenSSL 1.x.

Chacha20Poly1305类已被添加到System.Security.cryptography。为了使用Chacha20 / Poly1305算法,必须由底层操作系统支持。静态播放属性可用于确定算法是否在给定的上下文中支持。

该团队一直在添加Object-C支持,其目标是具有单一目标-C互操作性的.NET。到目前为止,Objective-C互操作系统是在Mono嵌入式API周围构建的,但我们决定它不是跨越运行时分享的正确方法。因此,我们创建了一个新的.NET API,它将启用一个Object-C互操作体验,最终将在两个运行时工作。

Objective-C Interop的这个新API在NSAuteLeasePool的运行时立即支持,这使得能够支持Cocoa的参考记忆管理系统。您现在可以配置是否希望每个托管线程都有隐式NSAutorEaseAsePool。这使得能够以每线程释放可可对象。

自从.NET 6开始,Monovm已添加大量诊断功能。这使得它已启用托管事件/ enceListener,eventPipe和诊断程序等功能。 它已使用Dotnet-Trace,Dotnet-Counters,DotNet-Stack等应用程序启用,用于在移动设备(iOS / Android)以及桌面上运行的应用程序。 这些新功能开辟了分析Monovm生成的NetTrace文件的能力,如Priveview / Speed ......