将应用发布为 本机 AOT 会生成一个 自包含 且已预先编译为本机代码的应用。 本机 AOT 应用具有更快的启动时间和更小的内存占用量。 这些应用可以在未安装 .NET 运行时的计算机上运行。
本地 AOT 的优势在于对于具有大量已部署实例的工作负载(例如云基础设施和超大规模服务)尤其显著。 .NET 8 添加了 对本机 AOT 的 ASP.NET Core 支持。
本机 AOT 部署模型使用预先编译器在发布时将 IL 编译为本机代码。 AOT 原生应用在运行时不使用即时编译器(JIT)。 本地 AOT 应用程序可以在禁止使用 JIT 编译器的受限环境中运行。 本机 AOT 应用程序面向特定的运行时环境,例如 Linux x64 或 Windows x64,就像发布 独立应用一样。
先决条件
Visual Studio 2022,包括“使用 C++ 进行桌面开发”的工作负载,以及所有默认组件。
使用 CLI 发布本地原生 AOT
将
<PublishAot>true</PublishAot>
添加到项目文件中。此属性在发布期间启用本机 AOT 编译。 它还可在生成和编辑期间启用动态代码使用情况分析。 最好在项目文件中放置此设置,而不是在命令行上传递此设置,因为它控制发布外部的行为。
<PropertyGroup> <PublishAot>true</PublishAot> </PropertyGroup>
使用
dotnet publish -r <RID>
发布应用程序以配合特定的运行时标识符。以下示例演示如何在安装了所需先决条件的计算机上,将适用于 Windows 的应用程序发布为本机提前编译(AOT)应用程序。
dotnet publish -r win-x64 -c Release
以下示例将应用程序发布为适用于 Linux 的本机AOT应用程序。 在 Linux 计算机上生成的本机 AOT 二进制文件仅适用于相同或更新的 Linux 版本。 例如,在 Ubuntu 20.04 上生成的本机 AOT 二进制文件将在 Ubuntu 20.04 及更高版本上运行,但它不会在 Ubuntu 18.04 上运行。
dotnet publish -r linux-arm64 -c Release
该应用可在发布目录中使用,其中包含运行所需的所有代码,包括简化版的 coreclr 运行时。
查看 GitHub 上 dotnet/samples 存储库中提供的 本机 AOT 示例 。 这些示例包括 Linux 和 Windows Dockerfiles,演示如何使用容器的方式,通过 Native AOT 自动安装先决条件并发布 .NET 项目。
AOT 兼容性分析器
该 IsAotCompatible
属性用于指示库是否与本机 AOT 兼容。 考虑库何时将 IsAotCompatible
属性设置为 true
,例如:
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
上述配置将默认 true
分配给以下属性:
IsTrimmable
EnableTrimAnalyzer
EnableSingleFileAnalyzer
EnableAotAnalyzer
这些分析器有助于确保库与本机 AOT 兼容。
本机调试信息
默认情况下,Native AOT 发布会在一个单独的文件中生成调试信息。
- Linux: .dbg
- Windows:.pdb
- macOS: .dSYM 文件夹
调试文件是调试器下运行应用 或检查故障转储所必需的。 在类 Unix 平台上,将 StripSymbols
属性设置为 false
,以在本地二进制文件中包含调试信息。 包括调试信息会使本机二进制文件更大。
<PropertyGroup>
<StripSymbols>false</StripSymbols>
</PropertyGroup>
本机 AOT 部署的限制
本机 AOT 应用具有以下限制:
- 例如
Assembly.LoadFile
,没有动态加载。 - 例如
System.Reflection.Emit
,不生成运行时代码。 - 无C++/CLI。
- Windows:无内置 COM。
- 需要进行剪裁,这一过程存在限制。
- 表示编译成单个文件时,会出现已知的不兼容问题。
- 与依赖框架的应用相比,应用包括所需的运行时库(就像 自包含应用一样),其大小会增大。
- System.Linq.Expressions 始终使用其解释形式,这比运行时生成的已编译代码慢。
- 替换为结构类型参数的泛型参数将为每个实例化生成专用代码。 在动态运行时中,会按需生成许多实例化。 在本机AOT中,所有实例都会被预先生成。 这可能会影响应用程序的磁盘大小。 泛型虚拟方法和泛型实例方法还将为每个实现或重写类型提供实例化。
- 并非所有运行时库都完全批注为本机 AOT 兼容。 也就是说,最终开发者无法对运行时库中的一些警告采取行动。
- 诊断支持用于调试和性能分析, 但存在一些限制。
- 支持某些 ASP.NET 核心功能。 有关详细信息,请参阅 ASP.NET Core 对本机 AOT 的支持。
发布过程会分析整个项目及其依赖项,以发现可能的限制。 针对发布的应用在运行时可能会遇到的每个限制发出警告。
平台/体系结构限制
下表显示了支持的编译目标。
平台 | 支持的体系结构 | 注释 |
---|---|---|
Windows操作系统 | x64、Arm64 | |
Linux | x64、Arm64 | |
macOS | x64、Arm64 | |
iOS | ARM64 | 实验性支持 |
iOSSimulator | x64、Arm64 | 实验性支持 |
tvOS | ARM64 | 实验性支持 |
tvOSSimulator | x64、Arm64 | 实验性支持 |
MacCatalyst | x64、Arm64 | 实验性支持 |
安卓 | x64、Arm64 | 实验性,无内置 Java 互操作性 |
要了解本机 AOT 对某个平台的支持的详细信息,请点击表中的链接。