大家好,aspnet网站源码分享下载相信很多的网友都不是很明白,包括aspnet项目源码也是一样,不过没有关系,接下来就来为大家分享关于aspnet网站源码分享下载和aspnet项目源码的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
*本文阅读时间25分钟,建议收藏学习
我们很高兴发布.NET6Preview4。我们现在大约完成了.NET6发布的一半。现在是一个很好的时机,可以再次查看.NET6的完整范围。许多功能都接近最终形式,而其他功能将很快推出,因为发布的基础构建块已经就绪。预览版4为在11月交付最终的.NET6构建奠定了坚实的基础,并提供了完整的功能和体验。如果您还没有在您的环境中尝试过.NET6,那么您现在可以用拉。
说到最终版本,我们现在有一个日期了!预计在11月9日至11日的.NETConf2021。我们将在9日发布.NET6,其中包含许多深入的演讲和演示,告诉您有关.NET6的所有信息。
您可以下载适用于Linux、macOS和Windows的.NET6预览版4。
安装程序和二进制文件https://dotnet.microsoft.com/download/dotnet/6.0容器镜像https://hub.docker.com/_/microsoft-dotnetLinux软件包https://github.com/dotnet/core/blob/main/release-notes/6.0/install-linux.md发行说明https://github.com/dotnet/core/blob/main/release-notes/6.0/README.md已知的问题https://github.com/dotnet/core/blob/main/release-notes/6.0/known-issues.mdGitHub问题跟踪https://github.com/dotnet/core/issues/6295
有关Web和数据访问方案的新增功能的更多详细信息,请参阅ASP.NETCore和EFCore帖子。还有新的.NETMAUI帖子描述了新的客户端应用程序体验,还有一个热重载帖子描述了提高开发人员生产力的新方法。
.NET6已经过VisualStudio16.11和VisualStudioforMac8.9的测试。如果您想在VisualStudio中试用.NET6,我们建议您使用这些版本。
.NETConf2021:
https://www.dotnetconf.net/
.NET6预览版4:https://dotnet.microsoft.com/download/dotnet/6.0
ASP.NETCore:https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-4
EFCore:
https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-6-0-preview-4-performance-edition
.NETMAUI:
https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-4/
热重载:
https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/
VisualStudio16.11:
https://visualstudio.microsoft.com/vs/
VisualStudioforMac8.9:
https://visualstudio.microsoft.com/vs/mac/
VisualStudio:
https://visualstudio.microsoft.com/
Build2021
MicrosoftBuild大会已经举行了。你肯定会想看看这些演讲,其中将包含大量关于.NET6的讨论和演示,向你展示新功能和现在可能实现的功能。
.NET现代应用程序开发的未来https://docs.microsoft.com/en-us/events/build-may-2021/azure/breakouts/brk213/?ocid=AID3032299.NET6:新的和即将发生的https://docs.microsoft.com/en-us/events/build-may-2021/azure/breakouts/od485/?ocid=AID3032299.NET团队“咨询专家”https://docs.microsoft.com/en-us/events/build-may-2021/ask-the-experts/connection-zone/atebrk213/?ocid=AID3032299
.NET6主题
我们于2020年底开始在GitHub上规划.NET6。我们在一系列广泛的主题中确定了八个主题,包括行业场景、支持和教育。这些主题代表了我们发布工作的一半到四分之三。有很多项目没有上升到主题的水平,或者意义重大但不是主题(例如支持AppleSilicon设备)。
以下是.NET6主题,每个主题都用一句话总结描述。它们按照在themesof.net中显示的相同顺序列出。
.NET对新开发人员和学生具有吸引力—在VisualStudio产品中提供有意简化的体验,包括清晰的文档、更简单的代码模型和更少的文件和概念,以及将工件部署到测试和生产环境的直观路径。https://github.com/dotnet/core/issues/5465.NET拥有出色的客户端应用程序开发体验—提供跨平台客户端应用程序基础,可无缝满足桌面、移动和Web开发人员的需求,并基于Blazor和Xamarin等现有应用程序类型进行构建和扩展。https://github.com/dotnet/core/issues/5423.NET被公认为构建云原生应用程序的引人注目的框架——提供主要针对性能和可观察性的基本云原生功能,改进与云原生和容器生态系统的集成,以及一个云原生组件(yarp),它展示了很多.NET的价值与关键的云用例。https://github.com/dotnet/core/issues/5423企业和LTS—提供更简单、更可预测的模型,以将.NET与关键任务应用程序结合使用,并更好地满足大型企业和政府客户的需求。https://github.com/dotnet/core/issues/5238通过提高质量、信心和支持来发展.NET生态系统——建立长期的社区合作,旨在将社区开发人员提升到与Microsoft类似的水平,并(另一方面)提供新的功能和体验,使其成为企业开发人员更容易依赖社区开源项目中的库,而社区开源项目不一定与大公司有关联或得到大公司的支持。https://github.com/dotnet/core/issues/5415提高.NET开发人员的内循环性能——提高开发人员的工作效率,包括提高构建性能、热重启和热重载。https://github.com/dotnet/core/issues/5510使用运行时执行信息(PGO)提高启动和吞吐量—提供基于运行时信息的新模型以提高性能,可用于更快的启动、更高的吞吐量和更小的二进制文件。https://github.com/dotnet/core/issues/5491满足开发人员的期望—根据反馈在整个.NET产品中进行改进,并启用具有现有功能的新方案。https://github.com/dotnet/core/issues/5366
以下帖子更详细地讨论了其中一些主题:
.NET6预览版1https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/.NET6预览版2https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-2/关于PGO的对话https://devblogs.microsoft.com/dotnet/conversation-about-pgo/
规划.NET6:
https://themesof.net/
支持AppleSilicon设备:
https://github.com/dotnet/designs/pull/217
themesof.net:
https://themesof.net/
容器:
https://devblogs.microsoft.com/dotnet/category/containers/
yarp:
https://github.com/microsoft/reverse-proxy
.NET平台统一
我们在过去的帖子和会议上讨论了很多关于.NET统一的内容,但主题中缺少它。平台统一已经融入我们所做的一切,不需要自己的主题。人们可以将其视为超出所列主题的一个大主题。它贯穿多个主题,是团队前进的基本假设。
内循环性能项目就是一个很好的例子。它假定.NET6应用程序都共享相同的基础,例如使用相同的构建系统和库。如果存在技术差异,例如使用不同的运行时(CoreCLR或Mono)或代码生成技术(AOT或JIT),我们会考虑这些因素并提供务实和适当的体验,并倾向于没有可观察到的体验差异。EventPipe项目是另一个类似的例子。
.NET统一:
https://devblogs.microsoft.com/dotnet/introducing-net-5/
内循环性能项目:
https://github.com/dotnet/core/issues/5510
EventPipe项目:
8添加的一项重要功能。新的增强功能支持使用IAsyncEnumerable对象进行System.Text.Json(反)序列化。
以下示例使用流作为任何异步数据源的表示。源可以是本地机器上的文件,也可以是数据库查询或Web服务API调用的结果。
增强功能:
https://github.com/dotnet/runtime/issues/1570
流序列化
System.Text.Json现在支持将IAsyncEnumerable值序列化为JSON数组,如下例所示。
usingSystem;\nusingSystem.Collections.Generic;\nusingSystem.IO;\nusingSystem.Text.Json;\n\nstaticasyncIAsyncEnumerablePrintNumbers(intn)\n{\nfor(inti=0;i<n;i++)yieldreturni;\n}\n\nusingStreamstream=Console.OpenStandardOutput();\nvardata=new{Data=PrintNumbers(3)};\nawaitJsonSerializer.SerializeAsync(stream,data);//prints{&34;:[0,1,2]}
IAsyncEnumerable值仅支持使用异步序列化方法。尝试使用同步方法进行序列化将导致抛出NotSupportedException。
流反序列化
流式反序列化需要一个返回IAsyncEnumerable的新API。我们为此添加了JsonSerializer.DeserializeAsyncEnumerable方法,如下例所示。
usingSystem;\nusingSystem.IO;\nusingSystem.Text;\nusingSystem.Text.Json;\n\nvarstream=newMemoryStream(Encoding.UTF8.GetBytes(&34;));\nawaitforeach(intiteminJsonSerializer.DeserializeAsyncEnumerable(stream))\n{\nConsole.WriteLine(item);\n}
此示例将按需反序列化元素,并且在使用特别大的数据流时非常有用。它只支持从根级别的JSON数组中读取,尽管将来可以根据反馈放宽。
现有的DeserializeAsync方法名义上支持IAsyncEnumerable,但在其非流式方法签名的范围内。它必须将最终结果作为单个值返回,如下例所示。
usingSystem;\nusingSystem.Collections.Generic;\nusingSystem.IO;\nusingSystem.Text;\nusingSystem.Text.Json;\n\n\n\n\nvarstream=newMemoryStream(Encoding.UTF8.GetBytes(@&34;&34;&34;));\nvarresult=awaitJsonSerializer.DeserializeAsync(stream);\nawaitforeach(intiteminresult.Data)\n{\nConsole.WriteLine(item);\n}\n\n\n\n\npublicclassMyPoco\n{\npublicIAsyncEnumerableData{get;set;}\n}
在此示例中,反序列化器将在返回反序列化对象之前缓冲内存中的所有IAsyncEnumerable内容。这是因为反序列化器需要在返回结果之前消耗整个JSON值。
System.Text.Json:可写DOM功能
可写的JSONDOM功能为System.Text.Json添加了一个新的简单高效的编程模型。这个新的API很有吸引力,因为它避免了序列化的复杂性和仪式以及DOM的传统成本。
这个新的API有以下好处:
在不可能或不希望使用POCO类型的情况下,或者当JSON模式不固定且必须检查时,序列化的轻量级替代方案。允许对大树的子集进行有效修改。例如,可以高效地导航到大型JSON树的子部分并从该子部分读取数组或反序列化POCO。LINQ也可以与它一起使用。允许使用C6098中提供了更多详细信息。
可写的JSONDOM功能:
https://github.com/dotnet/designs/blob/main/accepted/2020/serializer/WriteableDomAndDynamic.md
有关支持动态的反馈:
https://github.com/dotnet/runtime/issues/53195
dotnet/runtimeissuecomment-840857013
可写的DOMAPI
可写DOM公开以下类型。
namespaceSystem.Text.Json.Node\n{\npublicabstractclassJsonNode{…};\npublicsealedclassJsonObject:JsonNode,IDictionary{…}\npublicsealedclassJsonArray:JsonNode,IList{…};\npublicabstractclassJsonValue:JsonNode{…};\n}
示例代码
以下示例演示了新的编程模型。
//ParseaJSONobject\nJsonNodejNode=JsonNode.Parse(&34;MyProperty&34;);\nintvalue=(int)jNode[&34;];\nDebug.Assert(value==42);\n//or\nvalue=jNode[&34;].GetValue<int>();\nDebug.Assert(value==42);\n\n\n//ParseaJSONarray\njNode=JsonNode.Parse(&34;);\nvalue=(int)jNode[1];\nDebug.Assert(value==11);\n//or\nvalue=jNode[1].GetValue<int>();\nDebug.Assert(value==11);\n\n\n//CreateanewJsonObjectusingobjectinitializersandarrayparams\nvarjObject=newJsonObject\n{\n[&34;]=newJsonObject\n{\n[&34;]=&34;,\n[&34;]=newJsonArray(10,11,12)\n}\n};\n\n\n//ObtaintheJSONfromthenewJsonObject\nstringjson=jObject.ToJsonString();\nConsole.WriteLine(json);//{&34;:{&34;:&34;,&34;:[10,11,12]}}\n\n\n//Indexersforpropertynamesandarrayelementsaresupportedandcanbechained\nDebug.Assert(jObject[&34;][&34;][1].GetValue<int>()==11);
Microsoft.Extensions.Logging编译时源代码生成器
.NET6引入了LoggerMessageAttribute类型。此属性是Microsoft.Extensions.Logging命名空间的一部分,使用时,它会生成performant日志API。源代码生成日志支持旨在为现代.NET应用程序提供高度可用且高性能的日志解决方案。自动生成的源代码依赖于ILogger接口和LoggerMessage.Define功能。
当LoggerMessageAttribute用于部分日志记录方法时,将触发源生成器。当被触发时,它要么能够自动生成它正在装饰的部分方法的实现,要么产生带有正确使用提示的编译时诊断。编译时日志记录解决方案在运行时通常比现有日志记录方法快得多。它通过最大限度地消除装箱、临时分配和拷贝来实现这一点。
直接手动使用LoggerMessage.DefineAPI有以下好处:
更短更简单的语法:声明性属性使用而不是。引导开发者体验:生成器给出警告,帮助开发者做正确的事。支持任意数量的日志参数。LoggerMessage.Define最多支持六个。支持动态日志级别。单独使用LoggerMessage.Define是不可能的。如果您想跟踪改进和已知问题,请参阅dotnet/runtime52549:
https://github.com/dotnet/runtime/issues/52549
基本用法
要使用LoggerMessageAttribute,消费类和方法需要是部分的。代码生成器在编译时触发,并生成部分方法的实现。
publicstaticpartialclassLog\n{\n[LoggerMessage(EventId=0,Level=LogLevel.Critical,Message=&34;)]\npublicstaticpartialvoidCouldNotOpenSocket(ILoggerlogger,stringhostName);\n}
在前面的示例中,日志记录方法是静态的,并且在属性定义中指定了日志级别。在静态上下文中使用该属性时,需要ILogger实例作为参数。您也可以选择在非静态上下文中使用该属性。有关更多示例和使用场景,请访问编译时日志源生成器的文档。
文档:
https://docs.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator
System.Linq增强功能
添加了社区请求和贡献的新System.LINQAPI。
新System.LINQAPI:
https://github.com/dotnet/runtime/issues/47231
对索引和范围参数的可枚举支持
Enumerable.ElementAt方法现在接受可枚举对象末尾的索引,如下例所示。
Enumerable.Range(1,10).ElementAt(^2);//returns9
添加了接受Range参数的Enumerable.Take重载。它简化了可枚举序列的切片:
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对实施的贡献。*https://github.com/dixin
TryGetNonEnumeratedCount
TryGetNonEnumeratedCount方法尝试在不强制枚举的情况下获取源可枚举的计数。这种方法在枚举之前预分配缓冲区很有用的情况下很有用,如下面的示例所示。
Listbuffer=source.TryGetNonEnumeratedCount(outintcount)?newList(capacity:count):newList();\nforeach(Titeminsource)\n{\nbuffer.Add(item);\n}
TryGetNonEnumeratedCount检查实现ICollection/ICollection的源或利用Linq采用的一些内部优化。
利用Linq采用的一些内部优化:
https://github.com/dotnet/runtime/blob/a123d28793ad22954ca6d9074f43b540d0d30b43/src/libraries/System.Linq/src/System/Linq/IIListProvider.cs
DistinctBy/UnionBy/IntersectBy/ExceptBy
新的变体已添加到set操作中,允许使用键选择器函数指定相等性,如下面的示例所示。
Enumerable.Range(1,20).DistinctBy(x=>x%3);//{1,2,3}\n\n\n\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)}
MaxBy/MinBy
MaxBy和MinBy方法允许使用键选择器查找最大或最小元素,如下例所示。
varpeople=new(stringName,intAge)[]{(&34;,20),(&34;,30),(&34;,40)};\npeople.MaxBy(person=>person.Age);//(&34;,40)
Chunk
Chunk可用于将可枚举的源分块为固定大小的切片,如下例所示。
IEnumerablechunks=Enumerable.Range(0,10).Chunk(size:3);//{{0,1,2},{3,4,5},{6,7,8},{9}}
感谢RobertAndersson对实施的贡献。*https://github.com/inputfalken
FirstOrDefault/LastOrDefault/SingleOrDefault重载采用默认参数
如果源枚举为空,现有的FirstOrDefault/LastOrDefault/SingleOrDefault方法返回default(T)。添加了新的重载,接受在这种情况下要返回的默认参数,如下面的示例所示。
Enumerable.Empty().SingleOrDefault(-1);//returns-1
感谢@Foxtrek64对实现的贡献。*https://github.com/Foxtrek64
接受三个枚举的Zip重载
Zip方法现在支持组合三个可枚举项,如下例所示。
varxs=Enumerable.Range(1,10);\nvarys=xs.Select(x=>x.ToString());\nvarzs=xs.Select(x=>x%2==0);\n\n\nforeach((intx,stringy,boolz)inEnumerable.Zip(xs,ys,zs))\n{\n}
感谢HuoYaoyuan对实施的贡献。*https://github.com/huoyaoyuan
显着提高了Windows上的FileStream性能
FileStream已在.NET6中重新编写,以便在Windows上具有更高的性能和可靠性。
重写项目已经分阶段进行了五个PR:
引入FileStreamStrategy作为FileStream重写的第一步https://github.com/dotnet/runtime/pull/47128FileStream重写第二部分https://github.com/dotnet/runtime/pull/48813文件流优化https://github.com/dotnet/runtime/pull/49975FileStream重写:使用IValueTaskSource而不是TaskCompletionSourcehttps://github.com/dotnet/runtime/pull/50802FileStream重写:在AsyncWindowsFileStreamStrategy中缓存ValueTaskSourcehttps://github.com/dotnet/runtime/pull/51363
最终结果是FileStream在Windows上为异步IO创建时永远不会阻塞。这是一个重大的改进。您可以在基准测试中观察到这一点,我们很快就会看到。
重写项目:
https://github.com/dotnet/runtime/issues/40359
配置
第一个PR使FileStream能够在运行时选择一个实现。这种模式最明显的好处是可以切换回旧的.NET5实现,您可以使用runtimeconfig.json中的以下设置来实现。
{\n&34;:{\n&34;:true\n}\n}
我们计划接下来添加一个io_uring策略,它利用了最近内核中同名的Linux功能。
io_uring策略:
https://github.com/dotnet/runtime/issues/51985
最近内核:
34;file.txt&34;file.txt&34;file.txt&34;file.txt&6098。
dotnet/coreissuecomment-830154834
增强的日期、时间和时区支持
对日期和时间相关的类型进行了以下改进。
改进:
https://github.com/dotnet/runtime/issues/45318
新的DateOnly和TimeOnly结构
添加了仅限日期和时间的结构,具有以下特征:
每个代表一个DateTime的一半,或者只是日期部分,或者只是时间部分。DateOnly是生日、周年纪念日和工作日的理想选择。它与SQLServer的日期类型一致。TimeOnly是定期会议、闹钟和每周工作时间的理想选择。它与SQLServer的时间类型一致。补充现有的日期/时间类型(DateTime、DateTimeOffset、TimeSpan、TimeZoneInfo)。在System命名空间中,在CoreLib中提供,就像现有的相关类型一样。
仅限日期和时间的结构:
https://github.com/dotnet/runtime/issues/49036
对DateTime.UtcNow的性能改进
这种改进有以下好处:
修复了在Windows上获取系统时间的2.5倍性能回归。利用Windows闰秒数据的5分钟滑动缓存,而不是在每次调用时获取。
改进:
https://github.com/dotnet/runtime/pull/50263
2.5倍性能回归:
https://github.com/dotnet/runtime/issues/13091
支持所有平台上的Windows和IANA时区
这种改进有以下好处:
使用TimeZoneInfo.FindSystemTimeZoneById时的隐式转换(https://github.com/dotnet/runtime/pull/49412)通过TimeZoneInfo上的新API进行显式转换:TryConvertIanaIdToWindowsId、TryConvertWindowsIdToIanaId和HasIanaId(https://github.com/dotnet/runtime/issues/49407)改进了使用不同时区类型的系统之间的跨平台支持和互操作。删除需要使用TimeZoneConverterOSS库。该功能现已内置。
改进的时区显示名称
这种改进有以下好处:
从TimeZoneInfo.GetSystemTimeZones返回的列表中的显示名称中消除歧义。利用ICU/CLDR全球化数据。仅适用于Unix。Windows仍然使用注册表数据。这可能会在以后更改。
改进:
https://github.com/dotnet/runtime/pull/50263
其他
UTC时区的显示名称和标准名称被硬编码为英语,现在使用与其余时区数据相同的语言(Unix上的CurrentUICulture,Windows上的操作系统默认语言)。由于大小限制,WASM中的时区显示名称改为使用非本地化的IANAID。TimeZoneInfo.AdjustmentRule嵌套类将其BaseUtcOffsetDelta内部属性设为公开,并获得一个以baseUtcOffsetDelta作为参数的新构造函数。(https://github.com/dotnet/runtime/issues/50256)TimeZoneInfo.AdjustmentRule还获得了在Unix上加载时区的其他修复(https://github.com/dotnet/runtime/pull/49733),(https://github.com/dotnet/runtime/pull/50131)
CodeGen
对RyuJIT编译器进行了以下改进。
社区贡献
@SingleAccretion在过去几个月中一直忙于进行以下改进。这是.NET6Preview3的补充。谢谢!*https://github.com/SingleAccretion
dotnet/runtime50450—处理通过助手完成的转换和值编号中的折叠溢出操作https://github.com/dotnet/runtime/pull/50450dotnet/runtime50703—不要混淆fgMorphBlocks中的fgDispBasicBlockshttps://github.com/dotnet/runtime/pull/50373
.NET6Preview3:
51664—更新JIT以使用从跨代处理的PGO数据中看到的新“LikelyClass”记录https://github.com/dotnet/runtime/pull/51664dotnet/runtime50633—修复了混合PGO/nonPGO编译https://github.com/dotnet/runtime/pull/50633dotnet/runtime51593—修改内联规模计算https://github.com/dotnet/runtime/pull/51593
动态PGO:
https://github.com/dotnet/runtime/issues/4361
JIT循环优化
对循环优化进行了以下改进。
dotnet/runtime51757—不要在循环克隆期间重新计算preds列表https://github.com/dotnet/runtime/pull/51757
循环优化:
https://github.com/dotnet/runtime/issues/43549
LSRA
对线性扫描寄存器分配(LRSA)进行了以下改进。
dotnet/runtime49930—在值编号级别折叠对const字符串的空检查https://github.com/dotnet/runtime/pull/49930dotnet/runtime50112—不要在潜在的BBJ_THROW候选中分配字符串文字https://github.com/dotnet/runtime/pull/50112dotnet/runtime50806—如果后面有意外的块,则放弃尾调用https://github.com/dotnet/runtime/pull/50806dotnet/runtime51409—概括围绕空流优化的分支https://github.com/dotnet/runtime/pull/51409
.NET诊断:EventPipeforMono和改进的EventPipe性能
EventPipe是.NET的跨平台机制,用于输出事件、性能数据和计数器。从.NET6开始,我们已将实现从C++移至C。通过此更改,Mono也将能够使用EventPipe!这意味着CoreCLR和Mono将使用相同的事件基础结构,包括.NET诊断CLI工具!这一变化还伴随着CoreCLR的小幅缩减:
我们还进行了一些更改,以提高负载下的EventPipe吞吐量。在前几个预览版中,我们进行了一系列更改,使吞吐量提高了.NET5所能达到的2.06倍:
使用dotnet/diagnostics中的EventPipeStress框架收集的数据。编写器应用程序在60秒内尽可能快地写入事件。记录成功和丢弃事件的数量。
有关详细信息,请参阅dotnet/runtime45518:
https://github.com/dotnet/runtime/issues/45518
IL剪裁
默认启用警告
剪裁警告告诉您剪裁可能会删除运行时使用的代码的地方。这些警告以前在默认情况下被禁用,因为警告非常嘈杂,主要是由于.NET平台没有作为第一类方案参与剪裁。
我们对.NET库(运行时库,而不是ASP.NETCore或Windows桌面框架)的大部分进行了注释,以便它们生成准确的剪裁警告。因此,我们认为是时候默认启用剪裁警告了。
您可以通过将设置为true来禁用警告。对于早期版本,您可以将相同的属性设置为false以查看剪裁警告。
剪裁警告为剪裁过程带来了可预测性,并使开发人员掌握了权力。我们将继续注释更多.NET库,包括后续版本中的ASP.NETCore。我们希望社区也能通过注释更多代码以确保安剪裁全来改善剪裁生态系统。
更多信息:
.NET6中的剪裁警告https://github.com/mono/linker/blob/main/docs/fixing-warnings.md准备.NET库以进行剪裁https://docs.microsoft.com/zh-cn/dotnet/core/deploying/prepare-libraries-for-trimming
默认剪裁模式=链接
.NET6中新的默认剪裁模式是链接。链接TrimMode不仅可以剪裁未使用的程序集,还可以剪裁未使用的成员,从而显着节省成本。
在.NET5中,默认情况下剪裁会尝试查找和删除未引用的程序集。这更安全,但提供的好处有限。现在默认情况下剪裁警告处于启用状态,开发人员可以对剪裁结果充满信心。
作为示例,让我们通过剪裁其中一个.NETSDK工具来看看这种剪裁改进。我将使用crossgen,即准备运行的编译器。它可以只用一些剪裁警告来剪裁,crossgen团队能够解决这些问题。
首先,让我们将crossgen发布为一个独立的应用程序,无需剪裁。它是80MB(包括.NET运行时和所有库)。
然后我们可以尝试(现在是旧版).NET5默认剪裁模式,copyused。结果下降到55MB。
新的.NET6默认剪裁模式链接将独立文件大小进一步降低到36MB。
我们希望新的链接剪裁模式能更好地满足剪裁的期望:显着节省和可预测的结果。
与NativeAOT共享模型
我们也为NativeAOT实验实施了相同的剪裁警告,这应该会以大致相同的方式改善NativeAOT编译体验。
crossgen,即准备运行的编译器:
https://docs.microsoft.com/dotnet/core/deploying/ready-to-run
NativeAOT实验:
https://github.com/dotnet/runtimelab/issues/248
单文件发布
对单文件应用程序发布进行了以下改进。
静态分析
.NET5中添加了用于单文件发布的分析器,以警告Assembly.Location和其他一些在单文件包中表现不同的API。
对于.NET6Preview4,我们改进了分析以允许自定义警告。如果您的API在单文件发布中不起作用,您现在可以使用[RequiresAssemblyFiles]属性对其进行标记,如果启用了分析器,则会出现警告。添加该属性还将使方法中与单个文件相关的所有警告静音,因此您可以使用该警告将警告向上传播到您的公共API。
当PublishSingleFile设置为true时,分析器会自动为exe项目启用,但您也可以通过将EnableSingleFileAnalysis设置为true为任何项目启用它。如果您想在单个文件包中嵌入库,这可能会有所帮助。
压缩
单文件包现在支持压缩,这可以通过将属性EnableCompressionInSingleFile设置为true来启用。在运行时,根据需要将文件解压缩到内存中。压缩可以为某些场景提供巨大的空间节省。
让我们看一下与NuGet包资源管理器一起使用的带压缩和不带压缩的单个文件发布。
无压缩:172MB
压缩后:71.6MB
压缩可以显着增加应用程序的启动时间,尤其是在Unix平台上(因为它们具有无法与压缩一起使用的无复制快速启动路径)。您应该在启用压缩后测试您的应用,看看额外的启动成本是否可以接受。
PublishReadyToRun现在默认使用crossgen2
Crossgen2现在在发布ReadyToRun图像时默认启用。它还可选地支持生成合成图像。
公开以下设置,使您能够使用准备运行的代码配置发布。这些设置被设为它们的默认值。
PublishReadyToRun现在默认使用crossgen2
Crossgen2现在在发布ReadyToRun图像时默认启用。它还可选地支持生成合成图像。
公开以下设置,使您能够使用准备运行的代码配置发布。这些设置被设为它们的默认值。
NuGet包资源管理器:
https://github.com/NuGetPackageExplorer/NuGetPackageExplorer
Crossgen2:
https://devblogs.microsoft.com/dotnet/conversation-about-crossgen2/
.NET6SDK可选工作负载的CLI安装
.NET6将引入可以事后安装在.NETSDK之上的SDK工作负载的概念,以支持各种场景。预览版4中可用的新工作负载是.NETMAUI和BlazorWebAssemblyAOT工作负载。
对于.NETMAUI工作负载,我们仍然建议使用预览版4的maui-check工具,因为它包含VisualStudio中尚不可用的其他组件或作为.NETSDK工作负载。要尝试.NETSDK体验(以iOS为例),请运行dotnetworkinginstallmicrosoft-ios-sdk-full。安装后,您可以运行dotnetnewios,然后运行dotnetbuild来创建和构建您的项目。
对于BlazorWebAssemblyAOT,请按照ASP.NET博客提供的安装说明进行操作。
预览版4包括适用于iOS、Android、tvOS、MacOS和MacCatalyst的.NETMAUI工作负载。
请注意,dotnet工作负载安装会将工作负载从NuGet.org复制到您的SDK安装中,因此如果SDK安装位置受到保护(意味着在管理员/根位置),则需要运行提升/sudo。
SDK工作负载:
https://github.com/dotnet/designs/blob/main/accepted/2020/workloads/workloads.md
maui-check:
https://github.com/Redth/dotnet-maui-check
安装说明:
https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-4/
内置SDK版本检查
为了更轻松地跟踪新版本的SDK和运行时何时可用,我们向.NET6SDK添加了一个新命令:dotnetsdkcheck
这将告诉您在每个功能带内什么是.NETSDK和.NET运行时的最新可用版本。
CLI模板(dotnetnew)
预览版4引入了新的模板搜索功能。dotnetnew–search将在NuGet.org中搜索匹配模板。在即将进行的预览期间,用于此搜索的数据将更频繁地更新。
CLI中安装的模板可用于CLI和VisualStudio。安装新版本SDK时用户安装的模板丢失的早期问题已得到解决,但是需要重新安装.NET6Preview4之前安装的模板。
模板安装的其他改进包括支持–interactive开关以支持私有NuGet源的授权凭据。
安装CLI模板后,您可以通过–update-check和–update-apply检查更新是否可用。这现在将更快地反映模板更新,支持您定义的NuGet源,并支持–interactive授权凭据。
在预览版4和即将发布的预览版中,将清理dotnetnew命令的输出,以专注于您最需要的信息。例如,dotnetnew–install仅列出刚刚安装的模板,而不是所有模板。
为了支持这些以及即将对dotnetnew进行的更改,我们正在对模板引擎API进行重大更改,这可能会影响托管模板引擎的任何人。这些更改将出现在预览版4和预览版5中。如果您托管模板引擎,请通过https://github.com/dotnet/templating与我们联系,以便我们与您合作以避免或最大限度地减少中断。
NuGet.org:
https://www.nuget.org/
支持
.NET6将于2021年11月发布,并将作为长期支持(LTS)版本提供三年支持。平台矩阵已显着扩展。
新增内容是:
安卓IOSMac和MacCatalyst,适用于x64和AppleSilicon(又名“M1”)WindowsArm64(特别是Windows桌面)
.NET6Debian容器映像基于Debian11(“bullseye”),目前正在测试中。
长期支持(LTS)版本:
https://github.com/dotnet/core/blob/master/release-policies.mdhttps://github.com/dotnet/core/blob/master/release-policies.md
平台矩阵:
https://github.com/dotnet/core/blob/master/release-notes/6.0/supported-os.md
目前正在测试中:
https://wiki.debian.org/DebianBullseye
结束
此时我们已经进入.NET6版本。虽然11月的最终版本似乎还有很长的路要走,但我们已接近完成功能开发。现在是反馈的好时机,因为新功能的形状现在已经确定,而且我们仍处于积极的开发阶段,因此可以很容易地根据反馈采取行动。
说到11月,请在11月9日至11日期间预订一些时间观看.NETConf2021。这肯定会令人兴奋和有趣。我们将在11月9日发布最终的.NET6版本,以及比这一篇更长的博文。
还在寻找更多阅读?您可以查看我们的新对话系列。有很多关于.NET6新功能的详细见解。有任何技术问题,请在MicrosoftQ&A上提问.
我们希望您喜欢试用预览版4。
.NETConf2021:
https://www.dotnetconf.net/
对话:
https://devblogs.microsoft.com/dotnet/category/conversations/
MicrosoftQ&A:
https://docs.microsoft.com/en-us/answers/products/dotnet
文章分享结束,aspnet网站源码分享下载和aspnet项目源码的答案你都知道了吗?欢迎再次光临本站哦!