.NET 7 全新官方功能发布(速度更快、更轻量⚡)
微软的脚步从未停歇!几个月来,我们不断看到 .NET 开发团队的更新和消息,他们刚刚发布了 .NET 7 的第三个预览版。正式版计划于今年 11 月发布,在此之前,让我们先来了解一下它将带来的新功能和性能改进!
更快、更轻便的应用(原生 AOT)
一段时间后,实验性的原生AOT项目成为了微软开发的主要重点。正如我们许多人长期以来所要求的,微软决定为原生AOT带来一些更新。
对于那些不知道什么是 Native AOT 的人来说,预先编译(简称 AOT)是在编译时而不是运行时生成代码。
目前,微软已为此提供了ReadyToRun(客户端/服务器应用程序)和Mono AOT(移动和 WASM 应用程序)。此外,微软还补充道,Native AOT 并不会取代 Mono AOT 或 WASM。
原生 AOT 的特点正如其名:它在编译时生成原生代码。它最大的优势在于性能提升,主要体现在以下方面:
-
启动时间
-
内存使用情况
-
磁盘大小
-
访问受限平台
微软解释了原生 AOT 的工作原理:
应用程序在操作系统将其分页加载到内存中的那一刻就开始运行。数据结构针对运行AOT生成的代码进行了优化,而不是针对运行时编译新代码进行了优化。这与Go、Swift和Rust等语言的编译方式类似。原生AOT最适合对启动时间要求极高的环境。
此外,他们还公布了一项基准测试,将 NativeAOT 与 ReadyToRun 进行了比较,结果显示 NativeAOT 的编译速度提高了73%,而文件大小却减少了近一半:
- 速度对比(来源:微软):
- 尺寸对比(来源:微软):
系统.组合.托管
除了原生 AOT 之外,我们还有许多其他新功能,例如托管可扩展性框架更新:现在,新的 API 允许您向System.Composition.Hosting容器添加单个对象实例:
namespace System.Composition.Hosting
{
public class ContainerConfiguration
{
public ContainerConfiguration WithExport<TExport>(TExport exportedInstance);
public ContainerConfiguration WithExport<TExport>(TExport exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
public ContainerConfiguration WithExport(Type contractType, object exportedInstance);
public ContainerConfiguration WithExport(Type contractType, object exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
}
}
您可以查看原始提案:将现有对象注入 MEF2
可观测性
微软还改进了对云原生规范 ( OpenTelemetry ) 的支持。虽然 .NET 7 中仍在开发中,但已添加了“允许采样器修改跟踪状态”和“应允许采样器修改跟踪状态”这两个选项。以下是微软的示例:
// ActivityListener Sampling callback
listener.Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) =>
{
activityOptions = activityOptions with { TraceState = "rojo=00f067aa0ba902b7" };
return ActivitySamplingResult.AllDataAndRecorded;
};
缩短启动时间(写入-异或-执行)
正如我们一开始就看到的,微软决定主要专注于性能提升,这次也不例外。现在,通过重新实现存根来提升性能,我们已经看到启动时间缩短了10%到15% ,微软表示具体缩短幅度为10%到15%。
这主要是由于运行时代码创建后修改次数大幅减少所致。
更稳健地生成 X.500 名称
此外,微软在此次预览版中重点关注了加密安全。因此,构建应用程序X500DistinguishedName现在更加容易、更加安全。
对于那些不了解 X.500 名称构造的人来说,以前它是通过字符串操作(简单的字面值或格式化字符串)来完成的。方法如下:
request = new CertificateRequest($"CN={subjectName},OU=Test,O=""Fabrikam, Inc.""", ...);
主要问题在于引号、逗号或任何其他元素都会影响解析器。微软的解决方案是添加X500DistinguishedName类(检查)。由于每个方法只能操作单个RDN(相对专有名称) ,因此不会有问题。
我们来看微软的例子:
X500DistinguishedNameBuilder nameBuilder = new();
nameBuilder.AddCommonName(subjectName);
nameBuilder.AddOrganizationalUnitName("Test");
nameBuilder.AddOrganizationName("Fabrikam, Inc.");
request = new CertificateRequest(nameBuilder.Build(), ...);
以下是 .NET 7 预览版 3 的主要新特性。如果您想深入了解最新版本的所有新增功能,我建议您参考原文:.NET 7 预览版 3 发布公告。
文章来源:https://dev.to/bytehide/new-official-net-7-features-released-now-faster-and-lighter-55a8

