大家好,今天来为大家分享json视频网站源码分享的一些知识点,和json视频解析源码的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
欢迎使用.NET6。今天的版本是.NET团队和社区一年多努力的结果。C6提供了语言改进,使您的代码更简单、更好。性能大幅提升,我们已经看到微软降低了托管云服务的成本。.NET6是第一个原生支持AppleSilicon(Arm64)的版本,并且还针对WindowsArm64进行了改进。我们构建了一个新的动态配置文件引导优化(PGO)系统,该系统可提供仅在运行时才可能进行的深度优化。使用dotnetmonitor和OpenTelemetry改进了云诊断。WebAssembly支持更有能力和性能。为HTTP/3添加了新的API,处理JSON、数学和直接操作内存。.NET6将支持三年。开发人员已经开始将应用程序升级到.NET6,我们在生产中听到了很好的早期成果。.NET6已为您的应用程序做好准备。
您可以下载适用于Linux、macOS和Windows的.NET6。
安装程序和二进制文件容器图像Linux软件包发行说明API差异已知的问题GitHub问题跟踪器
请参阅ASP.NETCore、EntityFramework、WindowsForms、.NETMAUI、YARP和dotnet监视器帖子,了解各种场景中的新增功能。
.NET6亮点
.NET6是:
使用Microsoft服务、其他公司运行的云应用程序和开源项目进行生产压力测试。作为最新的长期支持(LTS)版本支持三年。跨浏览器、云、桌面、物联网和移动应用程序的统一平台,所有这些都使用相同的.NET库并能够轻松共享代码。性能得到了极大的提高,尤其是文件I/O,这共同导致了执行时间、延迟和内存使用的减少。C6添加了新功能,包括基于任务的异步、管道调试和众多性能改进。VisualBasic在VisualStudio体验和Windows窗体项目打开体验方面有所改进。HotReload使您能够跳过重新构建和重新启动您的应用程序以查看新更改(在您的应用程序运行时),VisualStudio2022和.NETCLI支持C扩展支持.NET6。
AzureApp服务:
AzureFunctions现在支持在.NET6中运行无服务器函数。AppService.NET6GAAnnouncement为ASP.NETCore开发人员提供了信息和详细信息,他们很高兴今天开始使用.NET6。Azure静态Web应用现在支持带有BlazorWebAssembly前端和AzureFunctionAPI的全栈.NET6应用程序。
注意:如果您的应用已经在应用服务上运行.NET6预览版或RC版本,则在将.NET6运行时和SDK部署到您所在区域后,它将在第一次重新启动时自动更新。如果您部署了一个独立的应用程序,您将需要重新构建和重新部署。
统一扩展平台
.NET6为浏览器、云、桌面、物联网和移动应用程序提供了一个统一的平台。底层平台已更新,可满足所有应用类型的需求,并便于在所有应用中重用代码。新功能和改进同时适用于所有应用程序,因此您在云或移动设备上运行的代码的行为方式相同并具有相同的优势。
.NET开发人员的范围随着每个版本的发布而不断扩大。机器学习和WebAssembly是最近添加的两个。例如,通过机器学习,您可以编写在流数据中查找异常的应用程序。使用WebAssembly,您可以在浏览器中托管.NET应用程序,就像HTML和JavaScript一样,或者将它们与HTML和JavaScript混合使用。
最令人兴奋的新增功能之一是.NETMulti-platformAppUI(.NETMAUI)。您现在可以在单个项目中编写代码,从而跨桌面和移动操作系统提供现代客户端应用程序体验。.NETMAUI将比.NET6稍晚发布。我们在.NETMAUI上投入了大量时间和精力,很高兴能够发布它并看到.NETMAUI应用程序投入生产。
当然,.NET应用程序也可以在家中使用Windows桌面(使用WindowsForms和WPF)以及使用ASP.NETCore在云中。它们是我们提供时间最长的应用程序类型,并且仍然非常受欢迎,我们在.NET6中对其进行了改进。
面向.NET6
继续以广泛平台为主题,在所有这些操作系统上编写.NET代码很容易。
要以.NET6为目标,您需要使用.NET6目标框架,如下所示:
<TargetFramework>net6.0<TargetFramework>
net6.0TargetFrameworkMoniker(TFM)使您可以访问.NET提供的所有跨平台API。如果您正在编写控制台应用程序、http://ASP.NETCore应用程序或可重用的跨平台库,这是最佳选择。
如果您针对特定操作系统(例如编写Windows窗体或iOS应用程序),那么还有另一组TFM(每个都针对不言而喻的操作系统)供您使用。它们使您可以访问所有net6.0的API以及一堆特定于操作系统的API。
net6.0-androidnet6.0-iosnet6.0-maccatalystnet6.0-tvosnet6.0-windows
每个无版本TFM都相当于针对.NET6支持的最低操作系统版本。如果您想要具体或访问更新的API,可以指定操作系统版本。
net6.0和net6.0-windowsTFMs都支持(与.NET5相同)。Android和AppleTFM是.NET6的新功能,目前处于预览阶段。稍后的.NET6更新将支持它们。
操作系统特定的TFM之间没有兼容性关系。例如,net6.0-ios与net6.0-tvos不兼容。如果您想共享代码,您需要使用带有34;MVC&34;第0层&34;第1层&34;热/冷分离&34;file.txt&39;stranslatedtoasinglesys-call!\n}
该示例演示:
使用新File.OpenHandleAPI打开文件句柄。使用新的预分配大小功能预分配磁盘空间。使用新的Scatter/GatherIOAPI写入文件。
预分配大小功能提高了性能,因为写入操作不需要扩展文件,并且文件不太可能被碎片化。这种方法提高了可靠性,因为写入操作将不再因空间不足而失败,因为空间已被保留。Scatter/GatherIOAPI减少了写入数据所需的系统调用次数。
更快的接口检查和转换
界面铸造性能提高了16%-38%。这种改进对于C的最大优势之一是它降低了贡献的障碍。这包括接口转换,它作为早期的.NET6更改移至C的人比懂C++的人多(而且运行时使用具有挑战性的C++模式)。仅仅能够阅读构成运行时的一些代码是培养以各种形式做出贡献的信心的重要一步。
归功于BenAdams。
System.Text.Json源生成器
我们为System.Text.Json添加了一个源代码生成器,它避免了在运行时进行反射和代码生成的需要,并且可以在构建时生成最佳序列化代码。序列化程序通常使用非常保守的技术编写,因为它们必须如此。但是,如果您阅读自己的序列化源代码(使用序列化程序),您可以看到明显的选择应该是什么,可以使序列化程序在您的特定情况下更加优化。这正是这个新的源生成器所做的。
除了提高性能和减少内存之外,源代码生成器还生成最适合装配修整的代码。这有助于制作更小的应用程序。
序列化POCO是一种非常常见的场景。使用新的源代码生成器,我们观察到序列化速度比我们的基准快1.6倍。
TechEmpower缓存基准测试平台或框架对来自数据库的信息进行内存缓存。基准测试的.NET实现执行缓存数据的JSON序列化,以便将其作为响应发送到测试工具。
我们观察到约100KRPS增益(增加约40%)。与MemoryCache性能改进相结合时,.NET6的吞吐量比.NET5高50%!
C10。C9中的顶级语句开始的简化之旅。新功能从Program.cs中删除了更多的仪式,导致程序只有一行。他们的灵感来自于与没有C10实现的更简单、更简洁的体验。我们收到反馈说,有些人不喜欢新模板,因为它们不适合专家,删除面向对象,删除在编写C10中还有其他一些功能和改进,包括记录结构。
全局使用指令
全局using指令让您using只需指定一次指令并将其应用于您编译的每个文件。
以下示例显示了语法的广度:
globalusingSystem;globalusingstaticSystem.Console;globalusingEnv=System.Environment;
您可以将globalusing语句放在任何.cs文件中,包括在Program.cs中。
隐式usings是一个MSBuild概念,它会根据SDK自动添加一组指令。例如,控制台应用程序隐式使用不同于ASP.NETCore。
隐式使用是可选的,并在a中启用PropertyGroup:
<ImplicitUsings>enable<mplicitUsings>
隐式使用对于现有项目是可选的,但默认包含在新C9将记录作为一种特殊的面向值的类形式引入。在C中的结构已经具有值相等,但记录结构添加了==运算符和IEquatable<T>的实现,以及基于值的ToString实现:
publicrecordstructPerson\n{\npublicstringFirstName{get;init;}\npublicstringLastName{get;init;}\n}
就像记录类一样,记录结构可以是&34;,这意味着它们有一个主构造函数,它隐式声明与参数对应的公共成员:
publicrecordstructPerson(stringFirstName,stringLastName);
但是,与记录类不同,隐式公共成员是_可变的自动实现的属性_。这样一来,记录结构就成为了元组的自然成长故事。例如,如果您有一个返回类型(stringFirstName,stringLastName),并且您希望将其扩展为命名类型,您可以轻松地声明相应的位置结构记录并维护可变语义。
如果你想要一个具有只读属性的不可变记录,你可以声明整个记录结构readonly(就像你可以其他结构一样):
publicreadonlyrecordstructPerson(stringFirstName,stringLastName);
C6
F更简单、更高效。这适用于语言设计、库和工具。我们对F的极端情况。我们很高兴能与F更快、更互操作
新语法task{…}直接创建一个任务并启动它。这是F和其他.NET语言的互操作性更强。以前,创建.NET任务需要使用async{…}来创建任务并调用Async.StartImmediateAsTask。
该功能task{…}建立在称为“可恢复代码”RFCFS-1087的基础之上。可恢复代码是一个核心特性,我们希望在未来使用它来构建其他高性能异步和屈服状态机。
F活动模式的未装箱表示。一个特别显着的性能改进在于列表和数组表达式的编译,现在它们的速度提高了4倍,并且调试也更好、更简单。
让F6启用expr[idx]索引语法。到目前为止,F用户的反复反馈,点的使用与他们期望的标准实践有不必要的差异。在新代码中,我们建议系统地使用新的expr[idx]索引语法。作为一个社区,我们都应该切换到这种语法。
F语言在F缩进规则中的一些不一致和限制。使F核心库添加了用于复制和更新列表、数组和序列的新函数,以及其他NativePtr内在函数。自2.0起弃用的F与您的期望保持一致,从而减少意外。
F中其他“隐式”和“类型导向”转换的支持。这意味着更少的显式向上转换,并为.NET样式的隐式转换添加了一流的支持。F工具
F34;管道调试&管道语法input|>f1|>f2的中间值。阴影值的调试显示已得到改进,消除了调试时常见的混淆源。F编译器并行执行解析阶段。F脚本现在更加健壮,允许您通过global.json文件固定使用的.NETSDK版本。
热重载
HotReload是另一个性能特性,专注于开发人员的生产力。它使您能够对正在运行的应用程序进行各种代码编辑,从而缩短您等待应用程序重新构建、重新启动或重新导航到您在进行代码更改后所在位置所需的时间。
HotReload可通过dotnetwatchCLI工具和VisualStudio2022使用。您可以将HotReload与多种应用类型一起使用,例如ASP.NETCore、Blazor、.NETMAUI、控制台、Windows窗体(WinForms)、WPF、WinUI3、Azure函数等。
使用CLI时,只需使用启动您的.NET6应用程序dotnetwatch,进行任何受支持的编辑,然后在保存文件时(如在VisualStudioCode中),这些更改将立即应用。如果不支持更改,详细信息将记录到命令窗口。
此图像显示了一个使用dotnetwatch.我对.cs文件和.cshtml文件进行了编辑(如日志中所述),两者都应用于代码并在不到半秒的时间内非常快速地反映在浏览器中。
使用VisualStudio2022时,只需启动您的应用程序,进行支持的更改,然后使用新的&34;按钮(如下图所示)应用这些更改。您还可以通过同一按钮上的下拉菜单选择在保存时应用更改。使用VisualStudio2022时,热重载可用于多个.NET版本,适用于.NET5+、.NETCore和.NETFramework。例如,您将能够对按钮的OnClickEvent处理程序进行代码隐藏更改。应用程序的Main方法不支持它。
注意:RuntimeInformation.FrameworkDescription中存在一个错误,该错误将在该图像中展示,很快就会修复。
HotReload还与现有的EditandContinue功能(在断点处停止时)以及用于实时编辑应用程序UI的XAMLHotReload协同工作。目前支持C)。
安全
.NET6中的安全性得到了显着改进。它始终是团队关注的重点,包括威胁建模、加密和深度防御防御。
在Linux上,我们依赖OpenSSL进行所有加密操作,包括TLS(HTTPS必需)。在macOS和Windows上,我们依赖操作系统提供的功能来实现相同的目的。对于每个新版本的.NET,我们经常需要添加对新版本OpenSSL的支持。.NET6增加了对OpenSSL3的支持。
OpenSSL3的最大变化是改进的FIPS140-2模块和更简单的许可。
.NET6需要OpenSSL1.1或更高版本,并且会更喜欢它可以找到的最高安装版本的OpenSSL,直到并包括v3。在一般情况下,当您使用的Linux发行版默认切换到OpenSSL3时,您最有可能开始使用OpenSSL3。大多数发行版还没有这样做。例如,如果您在RedHat8或Ubuntu20.04上安装.NET6,您将不会(在撰写本文时)开始使用OpenSSL3。
OpenSSL3、Windows1021H1和WindowsServer2022都支持ChaCha20Poly1305。您可以在.NET6中使用这种新的经过身份验证的加密方案(假设您的环境支持它)。
感谢KevinJones对ChaCha20Poly1305的Linux支持。
我们还发布了新的运行时安全缓解路线图。重要的是,您使用的运行时不受教科书攻击类型的影响。我们正在满足这一需求。在.NET6中,我们构建了W^X和英特尔控制流强制技术(CET)的初始实现。W^X完全受支持,默认为macOSArm64启用,并且可以选择加入其他环境。CET是所有环境的选择加入和预览。我们希望在.NET7中的所有环境中默认启用这两种技术。
Arm64
这些天来,对于笔记本电脑、云硬件和其他设备来说,Arm64令人兴奋不已。我们对.NET团队感到同样兴奋,并正在尽最大努力跟上这一行业趋势。我们直接与ArmHoldings、Apple和Microsoft的工程师合作,以确保我们的实施是正确和优化的,并且我们的计划保持一致。这些密切的合作伙伴关系对我们帮助很大。
特别感谢Apple在M1芯片发布之前向我们的团队发送了一蒲式耳Arm64开发套件供我们使用,并提供了重要的技术支持。特别感谢ArmHoldings,他们的工程师对我们的Arm64更改进行了代码审查,并进行了性能改进。
在此之前,我们通过.NETCore3.0和Arm32添加了对Arm64的初始支持。该团队在最近的几个版本中都对Arm64进行了重大投资,并且在可预见的未来这将继续下去。在.NET6中,我们主要关注在macOS和WindowsArm64操作系统上支持新的AppleSilicon芯片和x64仿真场景。
您可以在macOS11+和Windows11+Arm64操作系统上安装Arm64和x64版本的.NET。我们必须做出多种设计选择和产品更改以确保其奏效。
我们的策略是“亲原生架构”。我们建议您始终使用与原生架构相匹配的SDK,即macOS和WindowsArm64上的Arm64SDK。SDK是大量的软件。在Arm64芯片上本地运行的性能将比仿真高得多。我们更新了CLI以简化操作。我们永远不会专注于优化模拟x64。
默认情况下,如果您dotnetrun是带有Arm64SDK的.NET6应用程序,它将作为Arm64运行。您可以使用参数轻松切换到以x64运行,例如-adotnetrun-ax64.相同的论点适用于其他CLI动词。有关更多信息,请参阅适用于macOS和WindowsArm64的.NET6RC2更新。
我想确保涵盖其中的一个微妙之处。当您使用-ax64时,SDK仍以Arm64方式原生运行。.NETSDK体系结构中存在进程边界的固定点。在大多数情况下,一个进程必须全是Arm64或全是x64。我正在简化一点,但.NETCLI会等待SDK架构中的最后一个进程创建,然后将其作为您请求的芯片架构(如x64)启动。这就是您的代码运行的过程。这样,作为开发人员,您可以获得Arm64的好处,但您的代码可以在它需要的过程中运行。这仅在您需要将某些代码作为x64运行时才相关。如果你不这样做,那么你可以一直以Arm64的方式运行所有东西,这很棒。
Arm64支持
对于macOS和WindowsArm64,以下是您需要了解的要点:
支持并推荐.NET6Arm64和x64SDK。支持所有支持的Arm64和x64运行时。.NETCore3.1和.NET5SDK可以工作,但提供的功能较少,并且在某些情况下不受完全支持。dotnettest尚未与x64仿真一起正常工作。我们正在努力。dotnettest将作为6.0.200版本的一部分进行改进,并且可能更早。
有关更多完整信息,请参阅.NET对macOS和WindowsArm64的支持。
此讨论中缺少Linux。它不像macOS和Windows那样支持x64仿真。因此,这些新的CLI特性和支持方法并不直接适用于Linux,Linux也不需要它们。
视窗Arm64
我们有一个简单的工具来演示.NET运行的环境。
C:Usersrich>dotnettoolinstall-gdotnet-runtimeinfo\nYoucaninvokethetoolusingthefollowingcommand:dotnet-runtimeinfo\nTool&39;(version&39;)wassuccessfullyinstalled.\n\nC:Usersrich>dotnetruntimeinfo\n42\n42,d,d\n424242\n,adPPYb,42,adPPYba,MM42MMM8b,dPPYba,,adPPYba,MM42MMM\na8&34;&39;`&34;&34;&34;&34;42\n&34;8a,,a8&34;8b,,aa42,\n`&34;Y8`&34;&34;Y4284242`&34;&34;Y428\n\n**.NETinformation\nVersion:6.0.0\nFrameworkDescription:.NET6.0.0-rtm.21522.10\nLibrariesversion:6.0.0-rtm.21522.10\nLibrarieshash:4822e3c3aa77eb82b2fb33c9321f923cf11ddde6\n\n**Environmentinformation\nProcessorCount:8\nOSArchitecture:Arm64\nOSDescription:MicrosoftWindows10.0.22494\nOSVersion:MicrosoftWindowsNT10.0.22494.0
如您所见,该工具在WindowsArm64上本机运行。我将向您展示http://ASP.NETCore的样子。
macOSArm64
您可以看到在macOSArm64上的体验是相似的,并且还展示了架构目标。
rich@MacBook-Airapp%dotnet–version\n6.0.100\nrich@MacBook-Airapp%dotnet–info|grepRID\nRID:osx-arm64\nrich@MacBook-Airapp%catProgram.cs\nusingSystem.Runtime.InteropServices;\nusingstaticSystem.Console;\n\nWriteLine($&34;);\nrich@MacBook-Airapp%dotnetrun\nHello,Arm64from.NET6.0.0-rtm.21522.10!\nrich@MacBook-Airapp%dotnetrun-ax64\nHello,X64from.NET6.0.0-rtm.21522.10!\nrich@MacBook-Airapp%
这张图片展示了Arm64执行是Arm64SDK的默认设置,以及使用-a参数在目标Arm64和x64之间切换是多么容易。完全相同的体验适用于WindowsArm64。
此图像演示了相同的内容,但使用的是http://ASP.NETCore。我正在使用与您在上图中看到的相同的.NET6Arm64SDK。
Arm64上的Docker
Docker支持在本机架构和仿真中运行的容器,本机架构是默认的。这看起来很明显,但当大多数DockerHub目录都是面向x64时,这可能会让人感到困惑。您可以使用-platformlinux/amd64来请求x64图像。
我们仅支持在Arm64操作系统上运行LinuxArm64.NET容器映像。这是因为我们从不支持在QEMU中运行.NET,这是Docker用于架构模拟的。看来这可能是由于QEMU的限制。
此图像演示了我们维护的控制台示例:mcr.microsoft.com/dotnet/samples。这是一个有趣的示例,因为它包含一些基本逻辑,用于打印您可以使用的CPU和内存限制信息。我展示的图像设置了CPU和内存限制。
自己试试吧:dockerrun–rmmcr.microsoft.com/dotnet/samples
Arm64性能
AppleSilicon和x64仿真支持项目非常重要,但是,我们也普遍提高了Arm64性能。
此图像演示了将堆栈帧的内容清零的改进,这是一种常见的操作。绿线是新行为,而橙色线是另一个(不太有益的)实验,两者都相对于基线有所改善,由蓝线表示。对于此测试,越低越好。
容器
.NET6更适合容器,主要基于本文中讨论的所有改进,适用于Arm64和x64。我们还进行了有助于各种场景的关键更改。使用.NET6验证容器改进演示了其中一些改进正在一起测试。
Windows容器改进和新环境变量也包含在11月9日(明天)发布的11月.NETFramework4.8容器更新中。
发布说明可在我们的docker存储库中找到:
.NET6容器发行说明.NETFramework4.82021年11月容器发行说明
Windows容器
.NET6增加了对Windows进程隔离容器的支持。如果您在AzureKubernetes服务(AKS)中使用Windows容器,那么您依赖于进程隔离的容器。进程隔离容器可以被认为与Linux容器非常相似。Linux容器使用cgroups,Windows进程隔离容器使用JobObjects。Windows还提供Hyper-V容器,通过更强大的虚拟化提供更大的隔离。Hyper-V容器的.NET6没有任何变化。
此更改的主要价值是现在Environment.ProcessorCount将使用Windows进程隔离容器报告正确的值。如果在64核机器上创建2核容器,Environment.ProcessorCount将返回2.在以前的版本中,此属性将报告机器上的处理器总数,与DockerCLI、Kubernetes或其他容器编排器/运行时指定的限制无关。此值被.NET的各个部分用于扩展目的,包括.NET垃圾收集器(尽管它依赖于相关的较低级别的API)。社区库也依赖此API进行扩展。
我们最近在AKS上使用大量pod在生产中的Windows容器上与客户验证了这一新功能。他们能够以50%的内存(与他们的典型配置相比)成功运行,这是以前导致异常的OutOfMemoryException水平StackOverflowException。他们没有花时间找到最低内存配置,但我们猜测它明显低于他们典型内存配置的50%。由于这一变化,他们将转向更便宜的Azure配置,从而节省资金。只需升级即可,这是一个不错的、轻松的胜利。
优化缩放
我们从用户那里听说,某些应用程序在Environment.ProcessorCount报告正确的值时无法实现最佳扩展。如果这听起来与您刚刚阅读的有关Windows容器的内容相反,那么它有点像。.NET6现在提供DOTNET_PROCESSOR_COUNT环境变量来手动控制Environment.ProcessorCount的值。在典型的用例中,应用程序可能在64核机器上配置为4核,并且在8或16核方面扩展得最好。此环境变量可用于启用该缩放。
这个模型可能看起来很奇怪,其中Environment.ProcessorCount和–cpus(通过DockerCLI)值可能不同。默认情况下,容器运行时面向核心等价物,而不是实际核心。这意味着,当你说你想要4个核心时,你得到的CPU时间与4个核心相当,但你的应用程序可能(理论上)在更多的核心上运行,甚至在短时间内在64核机器上运行所有64个核心。这可能使您的应用程序能够在超过4个线程上更好地扩展(继续示例),并且分配更多可能是有益的。这假定线程分配基于Environment.ProcessorCount的值。如果您选择设置更高的值,您的应用程序可能会使用更多内存。对于某些工作负载,这是一个简单的权衡。至少,这是一个您可以测试的新选项。
Linux和Windows容器均支持此新功能。
Docker还提供了一个CPU组功能,您的应用程序可以关联到特定的内核。在这种情况下不建议使用此功能,因为应用程序可以访问的内核数量是具体定义的。我们还看到了将它与Hyper-V容器一起使用时的一些问题,并且它并不是真正适用于那种隔离模式。
Debian11&34;
我们密切关注Linux发行版的生命周期和发布计划,并尝试代表您做出最佳选择。Debian是我们用于默认Linux映像的Linux发行版。如果您6.0从我们的一个容器存储库中提取标签,您将提取一个Debian映像(假设您使用的是Linux容器)。对于每个新的.NET版本,我们都会考虑是否应该采用新的Debian版本。
作为一项政策,我们不会为了方便标签而更改Debian版本,例如6.0,mid-release。如果我们这样做了,某些应用程序肯定会崩溃。这意味着,在发布开始时选择Debian版本非常重要。此外,这些图像得到了很多使用,主要是因为它们是&34;的引用。
Debian和.NET版本自然不会一起计划。当我们开始.NET6时,我们看到Debian&34;可能会在2021年发布。我们决定从发布开始就押注于Bullseye。我们开始使用.NET6Preview1发布基于靶心的容器映像,并决定不再回头。赌注是.NET6版本会输掉与靶心版本的竞争。到8月8日,我们仍然不知道Bullseye什么时候发货,距离我们自己的版本发布还有三个月,即11月8日。我们不想在预览版Linux上发布生产.NET6,但我们坚持我们会输掉这场竞赛的计划很晚。
当Debian11&34;于8月14日发布时,我们感到非常惊喜。我们输掉了比赛,但赢得了赌注。这意味着默认情况下,.NET6用户从第一天开始就可以获得最佳和最新的Debian。我们相信Debian11和.NET6将是许多用户的绝佳组合。抱歉,克星,我们中了靶心。
较新的发行版在其软件包提要中包含各种软件包的较新主要版本,并且通常可以更快地获得CVE修复。这是对较新内核的补充。新发行版可以更好地为用户服务。
再往前看,我们很快就会开始计划对Ubuntu22.04的支持。Ubuntu是另一个Debian系列发行版,深受.NET开发人员的欢迎。我们希望为新的UbuntuLTS版本提供当日支持。
向TianonGravi致敬,感谢他们为社区维护Debian映像并在我们有问题时帮助我们。
DotnetMonitor
dotnetmonitor是容器的重要诊断工具。它作为sidecar容器镜像已经有一段时间了,但处于不受支持的&34;状态。作为.NET6的一部分,我们正在发布一个基于.NET6的dotnetmonitor映像,该映像在生产中得到完全支持。
dotnetmonitor已被AzureAppService用作其http://ASP.NETCoreLinux诊断体验的实现细节。这是预期的场景之一,建立在dotnetmonitor之上,以提供更高级别和更高价值的体验。
您现在可以拉取新图像:
dockerpullmcr.microsoft.com/dotnet/monitor:6.0
dotnetmonitor使从.NET进程访问诊断信息(日志、跟踪、进程转储)变得更加容易。在台式机上访问所需的所有诊断信息很容易,但是,这些熟悉的技术在使用容器的生产环境中可能不起作用。dotnetmonitor提供了一种统一的方式来收集这些诊断工件,无论是在您的桌面计算机上还是在Kubernetes集群中运行。收集这些诊断工件有两种不同的机制:
用于临时收集工件的HTTPAPI。当您已经知道您的应用程序遇到问题并且您有兴趣收集更多信息时,您可以调用这些API端点。基于规则的配置触发器,用于始终在线收集工件。您可以配置规则以在满足所需条件时收集诊断数据,例如,当您持续高CPU时收集进程转储。
dotnetmonitor为.NET应用程序提供了一个通用的诊断API,可以使用任何工具在任何地方工作。“通用API”不是.NETAPI,而是您可以调用和查询的WebAPI。dotnetmonitor包括一个ASP.NETWeb服务器,它直接与.NET运行时中的诊断服务器交互并公开来自诊断服务器的数据设计dotnetmonitor可实现生产中的高性能监控和安全使用,以控制对特权信息的访问。dotnetmonitor通过非Internet可寻址的unixdomainsocket与运行时交互——跨越容器边界。该模型通信模型非常适合此用例。
结构化JSON日志
JSON格式化程序现在是aspnet.NET6容器映像中的默认控制台记录器。.NET5中的默认设置为简单的控制台格式化程序。进行此更改是为了使默认配置与依赖机器可读格式(如JSON)的自动化工具一起使用。
图像的输出现在如下所示aspnet:
$dockerrun–rm-it-p8000:80mcr.microsoft.com/dotnet/samples:aspnetapp\n{&34;:60,&34;:&34;,&34;:&34;,&34;:&34;,&34;:{&34;:&34;,&34;:&34;,&34;:&34;}}\n{&34;:35,&34;:&34;,&34;:&34;,&34;:&34;,&34;:{&34;:&34;,&34;:&34;,&34;:&34;}}\n{&34;:14,&34;:&34;,&34;:&34;,&34;:&34;,&34;:{&34;:&34;,&34;:&34;,&34;:&34;}}\n{&34;:0,&34;:&34;,&34;:&34;,&34;:&34;,&34;:{&34;:&34;,&34;:&34;}}\n{&34;:0,&34;:&34;,&34;:&34;,&34;:&34;,&34;:{&34;:&34;,&34;:&34;,&34;:&34;}}\n{&34;:0,&34;:&34;,&34;:&34;,&34;:&34;,&34;:{&34;:&34;,&34;:&34;,&34;:&34;}}
Logging\\_\\_Console\\_\\_FormatterName可以通过设置或取消设置环境变量或通过代码更改来更改记录器格式类型(有关更多详细信息,请参阅控制台日志格式)。
更改后,您将看到如下输出(就像.NET5一样):
$dockerrun–rm-it-p8000:80-eLogging__Console__FormatterName=&34;mcr.microsoft.com/dotnet/samples:aspnetapp\nwarn:Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]\nStoringkeysinadirectory&39;thatmaynotbepersistedoutsideofthecontainer.Protecteddatawillbeunavailablewhencontainerisdestroyed.\nwarn:Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]\nNoXMLencryptorconfigured.Key{8d4ddd1d-ccfc-4898-9fe1-3e7403bf23a0}maybepersistedtostorageinunencryptedform.\ninfo:Microsoft.Hosting.Lifetime[14]\nNowlisteningon:http://[::]:80\ninfo:Microsoft.Hosting.Lifetime[0]\nApplicationstarted.PressCtrl+Ctoshutdown.\ninfo:Microsoft.Hosting.Lifetime[0]\nHostingenvironment:Production\ninfo:Microsoft.Hosting.Lifetime[0]\nContentrootpath:/app
注意:此更改不会影响开发人员计算机上的.NETSDK,例如dotnetrun.此更改特定于aspnet容器映像。
支持OpenTelemetry指标
作为我们关注可观察性的一部分,我们一直在为最后几个.NET版本添加对OpenTelemetry的支持。在.NET6中,我们添加了对OpenTelemetryMetricsAPI的支持。通过添加对OpenTelemetry的支持,您的应用程序可以与其他OpenTelemetry系统无缝互操作。
System.Diagnostics.Metrics是OpenTelemetryMetricsAPI规范的.NET实现。MetricsAPI是专门为处理原始测量而设计的,目的是高效、同时地生成这些测量的连续摘要。
API包括Meter可用于创建仪器对象的类。API公开了四个工具类:Counter、Histogram、ObservableCounter和,ObservableGauge以支持不同的度量方案。此外,API公开MeterListener该类以允许收听仪器记录的测量值,以用于聚合和分组目的。
OpenTelemetry.NET实现将被扩展以使用这些新的API,这些API添加了对Metrics可观察性场景的支持。
图书馆测量记录示例
Metermeter=newMeter(&34;,&34;);\nCounter<int>counter=meter.CreateCounter<int>(&34;);\ncounter.Add(1);\ncounter.Add(1,KeyValuePair.Create<string,object>(&34;,&34;));
听力示例
MeterListenerlistener=newMeterListener();\nlistener.InstrumentPublished=(instrument,meterListener)=>\n{\nif(instrument.Name==&34;&&instrument.Meter.Name==&34;)\n{\nmeterListener.EnableMeasurementEvents(instrument,null);\n}\n};\nlistener.SetMeasurementEventCallback<int>((instrument,measurement,tags,state)=>\n{\nConsole.WriteLine($&34;);\n});\nlistener.Start();
WindowsForms
我们继续在Windows窗体中进行重要改进。.NET6包括更好的控件可访问性、设置应用程序范围的默认字体、模板更新等的能力。
可访问性改进
在此版本中,我们添加了用于CheckedListBox、LinkLabel、Panel、ScrollBar和TabControlTrackBar的UIA提供程序,它们使讲述人等工具和测试自动化能够与应用程序的元素进行交互。
默认字体
您现在可以使用.Application.SetDefaultFont
voidApplication.SetDefaultFont(Fontfont)
最小的应用程序
以下是带有.NET6的最小Windows窗体应用程序:
classProgram\n{\n[STAThread]\nstaticvoidMain()\n{\nApplicationConfiguration.Initialize();\nApplication.Run(newForm1());\n}\n}
作为.NET6版本的一部分,我们一直在更新大多数模板,使其更加现代和简约,包括Windows窗体。我们决定让Windows窗体模板更传统一些,部分原因是需要将[STAThread]属性应用于应用程序入口点。然而,还有更多的戏剧而不是立即出现在眼前。
ApplicationConfiguration.Initialize()是一个源生成API,它在后台发出以下调用:
Application.EnableVisualStyles();\nApplication.SetCompatibleTextRenderingDefault(false);\nApplication.SetDefaultFont(newFont(…));\nApplication.SetHighDpiMode(HighDpiMode.SystemAware);
这些调用的参数可通过csproj或props文件中的MSBuild属性进行配置。
VisualStudio2022中的Windows窗体设计器也知道这些属性(目前它只读取默认字体),并且可以向您显示您的应用程序,就像它在运行时一样:
模板更新
C34;超级主机&34;apphost&导致调用速度提高了93%。感谢亚历克斯·科文顿。
大整数性能
改进了从十进制和十六进制字符串中解析BigIntegers。我们看到了高达89%的改进,如下图所示(越低越好)。
感谢约瑟夫·达席尔瓦。
ComplexAPI现在注释为readonly
现在对各种API进行了注释,System.Numerics.Complexreadonly以确保不会对readonly值或传递的值进行复制in。
归功于hrrrrustic。
BitConverter现在支持浮点到无符号整数位广播
BitConverter现在支持DoubleToUInt64Bits,HalfToUInt16Bits,SingleToUInt32Bits,UInt16BitsToHalf,UInt32BitsToSingle,和UInt64BitsToDouble.这应该使得在需要时更容易进行浮点位操作。
归功于MichalPetryka。
BitOperations支持附加功能
BitOperations现在支持IsPow2,RoundUpToPowerOf2和提供nint/nuint重载现有函数。
感谢约翰凯利、霍耀源和罗宾林德纳。
Vector,Vector2,Vector3和Vector4改进
Vector现在支持C34;C100&34;H99&34;H100&34;9007199254740997.0&34;Message&34;Hello,world!&34;Data&34;[0,1,2,3,4]&34;{&34;Data&34;:[0,1,2,3,4]}&34;{&34;:42}&34;MyProperty&34;MyProperty&34;[10,11,12]&34;MyChildObject&34;MyProperty&34;Hello&34;MyArray&34;MyChildObject&34;MyProperty&34;Hello&34;MyArray&34;MyChildObject&34;MyArray&34;Node1&34;Description&34;Node1&34;Next&编写的代码。对于C1)的Microsoft二进制构建来构建.NETSDK源代码,以生成SDK(2)再次构建相同的SDK源代码,以生成可证明的开源SDK(3)的最终二进制版本随后可供RHEL用户使用。之后,RedHat可以使用相同的SDK(编译器具有重要的可重现构建功能。
库API
除了已经涵盖的API之外,还添加了以下API。
WebSocket压缩
压缩对于通过网络传输的任何数据都很重要。WebSockets现在启用压缩。我们使用了WebSockets的扩展permessage-deflate实现,RFC7692。它允许使用该DEFLATE算法压缩WebSockets消息负载。此功能是GitHub上Networking的主要用户请求之一。
与加密一起使用的压缩可能会导致攻击,例如CRIME和BREACH。这意味着不能在单个压缩上下文中将秘密与用户生成的数据一起发送,否则可以提取该秘密。为了让用户注意到这些影响并帮助他们权衡风险,我们将其中一个关键API命名为DangerousDeflateOptions。我们还添加了关闭特定消息压缩的功能,因此如果用户想要发送秘密,他们可以在不压缩的情况下安全地执行此操作。
禁用压缩时WebSocket的内存占用减少了约27%。
从客户端启用压缩很容易,如下例所示。但是,请记住,服务器可以协商设置,例如请求更小的窗口或完全拒绝压缩。
varcws=newClientWebSocket();\ncws.Options.DangerousDeflateOptions=newWebSocketDeflateOptions()\n{\nClientMaxWindowBits=10,\nServerMaxWindowBits=10\n};
还添加了对ASP.NETCore的WebSocket压缩支持。
归功于伊万兹拉塔诺夫。
Socks代理支持
SOCKS是一种代理服务器实现,可以处理任何TCP或UDP流量,使其成为一个非常通用的系统。这是一个长期存在的社区请求,已添加到.NET6中。
此更改增加了对Socks4、Socks4a和Socks5的支持。例如,它可以通过SSH测试外部连接或连接到Tor网络。
该类WebProxy现在接受socks方案,如以下示例所示。
varhandler=newHttpClientHandler\n{\nProxy=newWebProxy(&34;,9050)\n};\nvarhttpClient=newHttpClient(handler);
归功于Huoyaoyuan。
Microsoft.Extensions.Hosting—配置主机选项API
我们在IHostBuilder上添加了一个新的ConfigureHostOptionsAPI,以简化应用程序设置(例如,配置关闭超时):
usingHostBuilderhost=new()\n.ConfigureHostOptions(o=>\n{\no.ShutdownTimeout=TimeSpan.FromMinutes(10);\n})\n.Build();\n\nhost.Run();
在.NET5中,配置主机选项有点复杂:
usingHostBuilderhost=new()\n.ConfigureServices(services=>\n{\nservices.Configure<HostOptions>(o=>\n{\no.ShutdownTimeout=TimeSpan.FromMinutes(10);\n});\n})\n.Build();\n\nhost.Run();
Microsoft.Extensions.DependencyInjection—CreateAsyncScopeAPI
CreateAsyncScope创建API是为了处理服务的处置IAsyncDisposable。以前,您可能已经注意到处置IAsyncDisposable服务提供者可能会引发InvalidOperationException异常。
以下示例演示了新模式,CreateAsyncScope用于启用using语句的安全使用。
awaitusing(varscope=provider.CreateAsyncScope())\n{\nvarfoo=scope.ServiceProvider.GetRequiredService<Foo>();\n}
以下示例演示了现有的问题案例:
usingSystem;\nusingSystem.Threading.Tasks;\nusingMicrosoft.Extensions.DependencyInjection;\n\nawaitusingvarprovider=newServiceCollection()\n.AddScoped<Foo>()\n.BuildServiceProvider();\n\n//ThisusingcanthrowInvalidOperationException\nusing(varscope=provider.CreateScope())\n{\nvarfoo=scope.ServiceProvider.GetRequiredService<Foo>();\n}\n\nclassFoo:IAsyncDisposable\n{\npublicValueTaskDisposeAsync()=>default;\n}
以下模式是先前建议的避免异常的解决方法。不再需要它。
varscope=provider.CreateScope();\nvarfoo=scope.ServiceProvider.GetRequiredService<Foo>();\nawait((IAsyncDisposable)scope).DisposeAsync();
感谢MartinBj?rkstr?m。
Microsoft.Extensions.Logging—编译时源生成器
.NET6引入了LoggerMessageAttribute类型。此属性是Microsoft.Extensions.Logging命名空间的一部分,使用时,它会源生成高性能日志记录API。源生成日志支持旨在为现代.NET应用程序提供高度可用和高性能的日志解决方案。自动生成的源代码依赖于ILogger接口和LoggerMessage.Define功能。
LoggerMessageAttribute源生成器在用于partial日志记录方法时触发。当被触发时,它要么能够自动生成partial它正在装饰的方法的实现,要么生成编译时诊断,并提供有关正确使用的提示。编译时日志记录解决方案在运行时通常比现有的日志记录方法快得多。它通过最大限度地消除装箱、临时分配和副本来实现这一点。
与直接手动使用LoggerMessage.DefineAPI相比,有以下好处:
更短更简单的语法:声明性属性使用而不是编码样板。引导式开发人员体验:生成器发出警告以帮助开发人员做正确的事情。支持任意数量的日志记录参数。LoggerMessage.Define最多支持六个。支持动态日志级别。这是LoggerMessage.Define单独不可能的。
要使用LoggerMessageAttribute,消费类和方法需要是partial。代码生成器在编译时触发并生成partial方法的实现。
publicstaticpartialclassLog\n{\n[LoggerMessage(EventId=0,Level=LogLevel.Critical,Message=&34;)]\npublicstaticpartialvoidCouldNotOpenSocket(ILoggerlogger,stringhostName);\n}
在前面的示例中,日志记录方法是static,并且在属性定义中指定了日志级别。在静态上下文中使用属性时,ILogger需要实例作为参数。您也可以选择在非静态上下文中使用该属性。有关更多示例和使用场景,请访问编译时日志记录源生成器文档。
System.Linq—可枚举的支持Index和Range参数
该Enumerable.ElementAt方法现在接受来自可枚举末尾的索引,如以下示例所示。
Enumerable.Range(1,10).ElementAt(^2);//returns9
添加了一个Enumerable.Take接受Range参数的重载。它简化了对可枚举序列的切片:
source.Take(..3)代替source.Take(3)source.Take(3..)代替source.Skip(3)source.Take(2..7)代替source.Take(7).Skip(2)source.Take(^3..)代替source.TakeLast(3)source.Take(..^3)代替source.SkipLast(3)source.Take(7..3)而不是.source.TakeLast(7).SkipLast(3)
感谢@dixin。
System.Linq—TryGetNonEnumeratedCount
该TryGetNonEnumeratedCount方法尝试在不强制枚举的情况下获取源可枚举的计数。这种方法在枚举之前预分配缓冲区很有用的场景中很有用,如下面的示例所示。
List<T>buffer=source.TryGetNonEnumeratedCount(outintcount)?newList<T>(capacity:count):newList<T>();\nforeach(Titeminsource)\n{\nbuffer.Add(item);\n}
TryGetNonEnumeratedCount检查实现ICollection/ICollection<T>;或利用Linq采用的一些内部优化的源。
System.Linq—DistinctBy/UnionBy/IntersectBy/ExceptBy
新变体已添加到允许使用键选择器函数指定相等性的集合操作中,如下例所示。
Enumerable.Range(1,20).DistinctBy(x=>x%3);//{1,2,3}\n\nvarfirst=new(stringName,intAge)[]{(&34;,20),(&34;,30),(&34;,40)};\nvarsecond=new(stringName,intAge)[]{(&34;,30),(&34;,30),(&34;,33)};\nfirst.UnionBy(second,person=>person.Age);//{(&34;,20),(&34;,30),(&34;,40),(&34;,33)}
System.Linq-MaxBy/MinBy
MaxBy和MinBy方法允许使用键选择器查找最大或最小元素,如下例所示。
varpeople=new(stringName,intAge)[]{(&34;,20),(&34;,30),(&34;,40)};\npeople.MaxBy(person=>person.Age);//(&34;,40)
System.Linq—Chunk
Chunk可用于将可枚举的源分块为固定大小的切片,如下例所示。
IEnumerable<int[]>chunks=Enumerable.Range(0,10).Chunk(size:3);//{{0,1,2},{3,4,5},{6,7,8},{9}}
归功于罗伯特安德森。
System.Linq——//FirstOrDefault采用默认参数的重载LastOrDefaultSingleOrDefault
如果源可枚举为空,则现有的FirstOrDefault/LastOrDefault/SingleOrDefault方法返回default(T)。添加了新的重载,它们接受在这种情况下返回的默认参数,如以下示例所示。
Enumerable.Empty\\<int\\>().SingleOrDefault(-1);//returns-1
感谢@Foxtrek64。
System.Linq—Zip接受三个可枚举的重载
Zip方法现在支持组合三个枚举,如以下示例所示。
varxs=Enumerable.Range(1,10);\nvarys=xs.Select(x=>x.ToString());\nvarzs=xs.Select(x=>x%2==0);\n\nforeach((intx,stringy,boolz)inEnumerable.Zip(xs,ys,zs))\n{\n}
归功于Huoyaoyuan。
优先队列
PriorityQueue<TElement,TPriority>(System.Collections.Generic)是一个新集合,可以添加具有值和优先级的新项目。在出队时,PriorityQueue返回具有最低优先级值的元素。您可以认为这个新集合类似于Queue<T>但每个入队元素都有一个影响出队行为的优先级值。
以下示例演示了.PriorityQueue<string,int>
//createsapriorityqueueofstringswithintegerpriorities\nvarpq=newPriorityQueue<string,int>();\n\n//enqueueelementswithassociatedpriorities\npq.Enqueue(&34;,3);\npq.Enqueue(&34;,1);\npq.Enqueue(&34;,2);\npq.Enqueue(&34;,3);\n\npq.Dequeue();//returns&34;\npq.Dequeue();//returns&34;\npq.Dequeue();//either&34;or&34;,stabilityisnotguaranteed.
归功于PatrykGolebiowski。
更快地将结构处理为字典值
CollectionsMarshal.GetValueRef是一个新的不安全API,它可以更快地更新字典中的结构值。新API旨在用于高性能场景,而不是用于一般用途。它返回ref结构值,然后可以使用典型技术对其进行更新。
以下示例演示了如何使用新API:
refMyStructvalue=CollectionsMarshal.GetValueRef(dictionary,key);\n//ReturnsUnsafe.NullRef<TValue>()ifitdoesn&34;MyMutexName&34;MySemaphoreName&34;MyEventWaitHandleName&34;MVC&43227中被证明具有类似的行为。
即用型代码/Crossgen2
Crossgen2是crossgen工具的替代品。它旨在满足两个结果:
让crossgen开发更高效。启用一组目前无法通过crossgen实现的功能。
这种转换有点类似于本机代码csc.exe到托管代码Roslyn编译器。Crossgen2是用C34;crossgen&编写的,难道你不需要启动运行时来运行crossgen2吗?”是的,但这不是本文中“离线”的含义。当crossgen2运行时,我们不使用运行crossgen2的运行时附带的JIT来生成准备运行(R2R)代码.那是行不通的,至少对于我们的目标来说是行不通的。想象一下crossgen2在x64机器上运行,我们需要为Arm64生成代码。Crossgen2将Arm64RyuJIT(针对x64编译)加载为原生插件,然后使用它生成Arm64R2R代码。机器指令只是保存到文件中的字节流。它也可以在相反的方向工作。在Arm64上,crossgen2可以使用编译为Arm64的x64RyuJIT生成x64代码。我们使用相同的方法来针对x64机器上的x64代码。Crossgen2会加载一个RyuJIT,它是为任何需要的配置而构建的。这可能看起来很复杂,但如果您想启用无缝的交叉定位模型,它就是您需要的那种系统,而这正是我们想要的。
我们希望只在一个版本中使用术语“crossgen2”,之后它将替换现有的crossgen,然后我们将回到使用术语“crossgen”来表示“crossgen2”。
.NET诊断:EventPipe
EventPipe是我们用于在进程内或进程外输出事件、性能数据和计数器的跨平台机制。从.NET6开始,我们已将实现从C++移至C。通过此更改,Mono也使用EventPipe。这意味着CoreCLR和Mono都使用相同的事件基础设施,包括.NET诊断CLI工具。
这一变化还伴随着CoreCLR的小幅减小:
库
大小之后-大小之前
差异
libcoreclr.so
7037856–7049408
-11552
我们还进行了一些更改,以提高EventPipe在负载下的吞吐量。在最初的几个预览版中,我们进行了一系列更改,从而使吞吐量提高了.NET5的2.06倍:
对于这个基准,越高越好。.NET6是橙色线,.NET5是蓝色线。
SDK
对.NETSDK进行了以下改进。
.NET6SDK可选工作负载的CLI安装
.NET6引入了SDK工作负载的概念。工作负载是可选组件,可以安装在.NETSDK之上以启用各种场景。.NET6中的新工作负载是:.NETMAUI和BlazorWebAssemblyAOT工作负载。我们可能会在.NET7中创建新的工作负载(可能来自现有的SDK)。工作负载的最大好处是减少大小和可选性。我们希望随着时间的推移使SDK变得更小,并且只安装您需要的组件。这个模型对开发者机器有好处,对CI来说甚至更好。
VisualStudio用户并不真正需要担心工作负载。工作负载功能经过专门设计,以便像VisualStudio这样的安装协调器可以为您安装工作负载。可以通过CLI直接管理工作负载。
工作负载功能公开了用于管理工作负载的多个动词,包括以下几个:
dotnetworkloadrestore—安装给定项目所需的工作负载。dotnetworkloadinstall—安装命名工作负载。dotnetworkloadlist—列出您已安装的工作负载。dotnetworkloadupdate—将所有已安装的工作负载更新到最新的可用版本。
update动词查询更新nuget.org的工作负载清单、更新本地清单、下载已安装工作负载的新版本,然后删除所有旧版本的工作负载。这类似于aptupdate&&aptupgrade-y(用于基于Debian的Linux发行版)。将工作负载视为SDK的私有包管理器是合理的。它是私有的,因为它仅适用于SDK组件。我们将来可能会重新考虑这一点。这些dotnetworkload命令在给定SDK的上下文中运行。假设您同时安装了.NET6和.NET7。工作负载命令将为每个SDK提供不同的结果,因为工作负载将不同(至少相同工作负载的不同版本)。
请注意,将http://NuGet.org中的工作负载复制到您的SDK安装中,因此如果SDK安装位置受到保护(即在管理员/根位置),dotnetworkloadinstall则需要运行提升或使用sudo。
内置SDK版本检查
为了更容易跟踪SDK和运行时的新版本何时可用,我们向.NET6SDK添加了一个新命令。
dotnetsdkcheck
它会告诉您是否有可用于您已安装的任何.NETSDK、运行时或工作负载的更新版本。您可以在下图中看到新体验。
dotnetnew
您现在可以在http://NuGet.org中搜索带有.dotnetnew–search
模板安装的其他改进包括支持切换以支持私有NuGet源的授权凭据。–interactive
安装CLI模板后,您可以通过和检查更新是否可用。–update-check–update-apply
NuGet包验证
包验证工具使NuGet库开发人员能够验证他们的包是否一致且格式正确。
这包括:
验证版本之间没有重大更改。验证包对于所有特定于运行时的实现是否具有相同的公共API集。确定任何目标框架或运行时适用性差距。
该工具是SDK的一部分。使用它的最简单方法是在项目文件中设置一个新属性。
<EnablePackageValidation>true</EnablePackageValidation>
更多Roslyn分析仪
在.NET5中,我们提供了大约250个带有.NETSDK的分析器。其中许多已经存在,但作为NuGet包在带外发送。我们为.NET6添加了更多分析器。
默认情况下,大多数新分析器都在信息级别启用。您可以通过如下配置分析模式在警告级别启用这些分析器:<AnalysisMode>All</AnalysisMode>
我们为.NET6发布了我们想要的一组分析器(加上一些附加功能),然后将它们中的大多数做成了可供抓取的。社区添加了几个实现,包括这些。
感谢MeikTranel和NewellClark。
为PlatformCompatibilityAnalyzer启用自定义防护
CA1416平台兼容性分析器已经使用OperatingSystem和RuntimeInformation中的方法识别平台防护,例如OperatingSystem.IsWindows和OperatingSystem.IsWindowsVersionAtLeast。但是,分析器无法识别任何其他保护可能性,例如缓存在字段或属性中的平台检查结果,或者在辅助方法中定义了复杂的平台检查逻辑。
为了允许自定义守卫的可能性,我们添加了新属性SupportedOSPlatformGuard并UnsupportedOSPlatformGuard使用相应的平台名称和/或版本注释自??定义守卫成员。此注释被平台兼容性分析器的流分析逻辑识别和尊重。
用法
[UnsupportedOSPlatformGuard(&34;)]//Theplatformguardattribute\nelse\ninternalboolIsSupported=>true;\n34;browser&39;ApiNotSupportedOnBrowser()&39;browser&34;Windows&34;Linux&34;Linux&34;Windows&39;ApiOnlyWorkOnWindowsLinux()&39;Linux&39;Windows'.\n\nif(_isWindowOrLinux)\n{\nApiOnlyWorkOnWindowsLinux();//Notwarn\n}\n}\n}
结束
欢迎使用.NET6。它是另一个巨大的.NET版本,在性能、功能、可用性和安全性方面都有很多的改进。我们希望您能找到许多改进,最终使您在日常开发中更有效率和能力,并提高性能或降低生产中应用程序的成本。我们已经开始从那些已经开始使用.NET6的人那里听到好消息。
在Microsoft,我们还处于.NET6部署的早期阶段,一些关键应用程序已经投入生产,未来几周和几个月内还会有更多应用程序推出。
.NET6是我们最新的LTS版本。我们鼓励每个人都转向它,特别是如果您使用的是.NET5。我们期待它成为有史以来采用速度最快的.NET版本。
此版本是至少1000人(但可能更多)的结果。这包括来自Microsoft的.NET团队以及社区中的更多人。我试图在这篇文章中包含许多社区贡献的功能。感谢您抽出宝贵时间创建这些内容并完成我们的流程。我希望这次经历是一次美好的经历,并且更多的人会做出贡献。
这篇文章是许多有才华的人合作的结果。贡献包括团队在整个发布过程中提供的功能内容、为此最终帖子创建的重要新内容,以及使最终内容达到您应得的质量所需的大量技术和散文更正。很高兴为您制作它和所有其他帖子。
感谢您成为.NET开发人员。
好了,关于json视频网站源码分享和json视频解析源码的问题到这里结束啦,希望可以解决您的问题哈!
