.NET 6 Preview 1 发布 (3)

用于操作 Windows ACLs 的包System.Threading.AccessControl 已经被改进,为 EventWaitHandle, Mutex 和 Semaphore 加入了新的 OpenExisting 和 TryOpenExisting 方法,允许打开现有的通过特殊 Windows 安全描述符创建的线程同步对象。

可移植线程池

.NET 6 通过托管实现,重新实现了 .NET 的线程池,并且作为 .NET 默认的线程池。

该线程池可以在不同平台(CoreCLR、Mono 等)上提供相同的行为。

如果想要恢复以前用非托管代码实现的线程池,可以指定环境变量 COMPlus_ThreadPool_UsePortableThreadPool=0,不过后续原来的线程池实现可能会被移除。

运行时

.NET 6 Preview 1 的新运行时特性包含 Apple Silicon 支持、crossgen2 以及部分 PGO 改进等等。

Apple Silicon 支持

.NET 6 Preview 1 开始原生支持 Apple Silicon,但是目前还处于 alpha 状态。

对于 .NET 6,将同时支持 macOS ARM64 的原生运行以及通过罗塞塔 2 模拟运行 x64 版本的 .NET。

下面是同一台 macOS ARM64 机器上运行 .NET 5 和 .NET 6 的输出,你可以看到区别:

rich@MacBook-Air dotnet-runtimeinfo % pwd /Users/rich/git/core/samples/dotnet-runtimeinfo rich@MacBook-Air dotnet-runtimeinfo % dotnet run **.NET information Version: 5.0.3 FrameworkDescription: .NET 5.0.3 Libraries version: 5.0.3 Libraries hash: c636bbdc8a2d393d07c0e9407a4f8923ba1a21cb **Environment information OSDescription: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Jan 22 03:28:00 PST 2021; root:xnu-7195.100.296.111.3~3/RELEASE_ARM64_T8101 OSVersion: Unix 11.0.0 OSArchitecture: X64 ProcessorCount: 8 rich@MacBook-Air dotnet-runtimeinfo % export DOTNET_ROLL_FORWARD=Major rich@MacBook-Air dotnet-runtimeinfo % export DOTNET_ROLL_TO_PRERELEASE=1 rich@MacBook-Air dotnet-runtimeinfo % dotnet run **.NET information Version: 6.0.0 FrameworkDescription: .NET 6.0.0-preview.1.21102.12 Libraries version: 6.0.0-preview.1.21102.12 Libraries hash: 9b2776d48183632662e0be873cef029cdb57f8d6 **Environment information OSDescription: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Jan 22 03:28:00 PST 2021; root:xnu-7195.100.296.111.3~3/RELEASE_ARM64_T8101 OSVersion: Unix 11.3.0 OSArchitecture: Arm64 ProcessorCount: 8 Apple Silicon 原生支持

苹果的新芯片相对于其他 ARM64 芯片来说有更严格运行要求,其中包括对 JIT 的要求,.NET 6 Preview 1 已经满足这些要求。

通用二进制(Universal binaries)是发布到苹果商店的另一个新要求,但是目前 .NET 6 应用并不支持,因此不能发布到苹果的应用商店,不过这部分也不是大部分 .NET 开发者所需要的。如果需要的话,.NET 会在 .NET 7 重新考虑是否支持通用二进制。

为了支持 Apple Silicon ABI 的要求,.NET 已经做出了一些改进,下面是对应的 Pull Request:

Use bytes in fgArgTabEntry

Support byte sizes from lowering to codegen

Preserve precise argument sizes

Use 4-byte stack alignment for hfa<float>

Arg alignment

调试

目前还无法在 Apple Silicon 上面调试原生 ARM64 的 .NET 程序,这将会在 Preview 3 或之后提供支持。不过通过罗塞塔 2 模拟运行 x64 的运行时是支持调试的。

已知问题

由于 Apple Silicon 页面大小为 16K,对于大的栈分配,JIT 无法生成清栈代码

可靠性不如 x64 版本的

因为没有机器所以 macOS ARM64 的 CI 还没有启用

还没有设计同时运行原生 .NET 和模拟 .NET 的方式,因此如果想要在 macOS ARM64 同时使用 .NET 6 和 .NET 5,建议通过 .tar.gz 手动安装,而不是通过包管理器直接安装,以便于控制版本

.tar.gz 的包被误报成恶意软件了

罗塞塔 2 仿真

.NET 5 的 x64 版本目前已经支持通过罗塞塔 2 仿真运行在 macOS ARM64 上。

单文件应用

在 .NET 6,完成了用于 Windows 和 macOS 的完全单文件应用支持。此前这一项只支持 Linux,所以在其他平台即使利用 PublishSingleFile 也还会带几个 .NET 的 dll 或者 dylib 文件。.NET 6 开始,这些文件都将被静态链接到程序当中,变成真正的单文件。

当然,这只是对于 runtime 而言的,如果你的程序引用了其他的 native 库,那么这些库还是会外带,而不会被链接进去。

macOS 单文件应用签名

.NET 6 的单文件应用现在满足了苹果的公证和签名要求,相关改动可以参考:https://github.com/dotnet/runtime/issues/3671。

Crossgen2

Crossgen2 将代替原有的 crossgen,旨在带来如下优点:

使 crossgen 更加高效并启用现有 crossgen 无法启用的一些特性

PGO 相关的计划取决于 crossgen2,影响 R2R 代码生成。.NET 6 中有 6 个项目依赖 crossgen2,这个东西非常重要

允许在不同系统和架构之间交叉编译

目前 .NET 的核心库 System.Private.Corelib 本身已经使用了 crossgen2 进行预编译了,后面将会把整个 .NET 自身利用 crossgen2 进行预编译。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssyzp.html