概念
aot是ahead-of-time的缩写,aot是将c#程序提前编译为机器代码(通常为平台特定的二进制文件),在应用程序启动之前完成编译过程。
微软官方文档是这样说的
将应用程序发布为本机 aot 会生成一个自包含的应用程序,并且已提前 (aot) 编译为本机代码。原生 aot 应用程序具有更快的启动时间和更小的内存占用。这些应用可以在未安装 .net 运行时的计算机上运行。 原生 aot 的优势对于具有大量已部署实例的工作负载(例如云基础设施和超大规模服务)最为明显。.net 8 添加了对本机 aot 的 asp.net core 支持。 本机 aot 部署模型使用预先编译器在发布时将 il 编译为本机代码。本机 aot 应用程序在应用程序运行时不使用实时 (jit) 编译器。本机 aot 应用程序可以在不允许 jit 的受限环境中运行。本机 aot 应用程序以特定的运行时环境为目标,例如 linux x64 或 windows x64,就像发布自包含应用程序一样。
c# aot部署和jit部署两种不同的编译和部署方式对比
aot(ahead-of-time)部署:
aot是将c#程序提前编译为机器代码(通常为平台特定的二进制文件),在应用程序启动之前完成编译过程。
优点:
- 启动速度快:由于已经提前编译成机器代码,应用程序可以直接执行,减少了启动时的编译延迟。
- 内存占用低:不需要在运行时为jit编译分配额外内存,避免了jit编译过程中可能的内存开销。
- 跨平台支持:aot编译后,可以生成特定平台的本地代码,能够更好地支持跨平台部署。
- 安全性:由于所有的代码已经提前编译为机器代码,jit编译的潜在安全风险(如代码注入等)较少。
- 性能稳定:aot编译会优化代码,尤其适用于性能要求严格的场景,能够提供更稳定的执行性能。
缺点:
- 编译时间长:aot需要在部署前进行编译,可能导致部署的时间较长。
- 平台依赖:aot编译会生成特定平台的机器码,因此跨平台部署需要针对每个平台生成不同版本的代码。
- 灵活性较低:jit可以根据运行时的环境和数据进行动态优化,而aot在编译时就决定了优化策略,缺乏运行时调整的灵活性。
jit(just-in-time)部署:
jit是在应用程序运行时将中间语言(il)编译为机器代码,编译过程是动态发生的。
优点:
- 快速开发:jit编译能够即时将中间语言编译为本地代码,因此可以更灵活地进行开发和调试。
- 跨平台支持:通过运行时环境(如.net core或mono),jit可以支持多平台的代码编译,而不需要为每个平台单独编译。
- 运行时优化:jit可以根据应用程序的运行环境和具体数据动态生成优化的机器代码,可能会实现更高的性能,尤其是在具有不同负载的应用场景下。
- 更高的灵活性:jit可以在运行时处理平台和硬件特性,为应用程序生成最合适的代码。
缺点:
- 启动时间慢:jit编译需要在运行时将代码编译为机器代码,因此启动速度较慢,特别是在初次运行时。
- 额外内存开销:jit编译需要在内存中保存编译生成的机器代码,这可能导致内存占用较高。
- 性能波动:由于jit编译是在运行时进行的,可能导致执行过程中存在性能波动,尤其是在复杂的代码路径上。
总结:
- aot部署适用于需要快速启动、内存占用较低、性能要求稳定的场景,例如嵌入式设备或资源受限的应用。它的主要缺点是编译时间较长以及缺乏运行时优化的灵活性。
- jit部署适用于需要较高灵活性、支持多平台和快速开发的场景,它能动态优化性能,但启动时间较长,并可能带来额外的内存开销。
选择aot还是jit部署,需要根据具体的应用场景、性能需求、开发周期和平台要求来权衡。
实操
创建一个解决方案,创建两个控制台项目,一个启用aot,一个不启用
未启用aot的csproj文件内容
<project sdk="microsoft.net.sdk"> <propertygroup> <outputtype>exe</outputtype> <targetframework>net9.0</targetframework> <implicitusings>enable</implicitusings> <nullable>enable</nullable> </propertygroup> </project>
启用aot的csproj文件内容
<project sdk="microsoft.net.sdk"> <propertygroup> <outputtype>exe</outputtype> <targetframework>net9.0</targetframework> <implicitusings>enable</implicitusings> <nullable>enable</nullable> <publishaot>true</publishaot> <invariantglobalization>true</invariantglobalization> </propertygroup> </project>
通过对比可以发现就这个配置
<publishaot>true</publishaot>
启用aot
参考官方文档:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/?tabs=windows%2cnet8
aot部署一般要在csproj增加如下配置
<publishaot>true</publishaot> <isaotcompatible>true</isaotcompatible> <stripsymbols>false</stripsymbols> <platformtarget>x64</platformtarget>
<publishaot>true</publishaot>
此属性在发布期间启用本机 aot 编译<isaotcompatible>true</isaotcompatible>
该属性用于指示库是否与本机 aot 兼容<stripsymbols>false</stripsymbols>
调试文件对于在调试器下运行应用程序或检查故障转储是必需的。在类 unix 平台上,将该属性设置为在本机二进制文件中包含调试信息。包含调试信息会使本机二进制文件更大<platformtarget>x64</platformtarget>
目标平台内容是anycpu、x86、x64、arm32、arm64,一般选择x64/anycpu即可,其它平台看场景
发布到win系统的aot
发布命令参考:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/ready-to-run
https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-publish
1.直接使用vs进行发布
2.使用dotnet命令
使用cmd进入到在csproj文件夹目录,执行dotnet命令
dotnet publish -c release -r win-x64 -p:publishreadytorun=true
发布到liunx系统的aot
如果直接在vs 2022上发布到liunx的aot部署会报下面错误
cross-os native compilation is not supported.
1、在 os-linux-ubuntu-2204 上安装 .net sdk 或 .net 运行时
使用包管理器安装
参考文档:
添加存储库
sudo add-apt-repository ppa:dotnet/backports
安装sdk
sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-9.0
安装运行时
#asp.net core 运行时 sudo apt-get update && \ sudo apt-get install -y aspnetcore-runtime-9.0
#.net 运行时 sudo apt-get install -y dotnet-runtime-9.0
使用脚本安装
参考文档
https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-scripted-manual#scripted-install
# 通过 wget 下载脚本 wget https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
#可执行文件运行的权限 chmod +x ./dotnet-install.sh
此脚本默认安装最新的长期支持 (lts) sdk 版本,即 .net 8。 若要安装最新版本(可能不是 (lts) 版本),请使用 --version latest 参数。
./dotnet-install.sh --version latest # 若要安装 .net 运行时而非 sdk,请使用 --runtime 参数。 ./dotnet-install.sh --version latest --runtime aspnetcore # 可以通过 --channel 参数更改特定主要版本来指示特定版本。 以下命令安装 .net 9.0 sdk。 ./dotnet-install.sh --channel 9.0
手动安装
参考文档:
下载sdk/runtime地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/9.0
这里下载的是dotnet-sdk-9.0.102-linux-x64.tar.gz
# 创建文件夹 sudo mkdir -p /usr/dotnet/9.0.102 # 解压文件 sudo tar xzf dotnet-sdk-9.0.102-linux-x64.tar.gz -c /usr/dotnet/9.0.102/ # 使用vim修改/etc/profile文件/或者使用ssh更改文件 sudo vim /etc/profile # 在/etc/profile文件下增加下面内容 export dotnet_home=/usr/dotnet/9.0.102 export path=${dotnet_home}:$path # 重新加载系统级别的环境配置文件 source /etc/profile
2、检查安装.net的版本
# 查看版本 dotnet --version # 检查 sdk 版本 dotnet --list-sdks # 检查运行时版本 dotnet --list-runtimes
3、 安装c++编译工具
参考文档:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/?tabs=linux-ubuntu%2cnet9plus
sudo apt-get install clang zlib1g-dev
4、把解决方案代码上传到linux系统某个文件夹上并转到要发布的项目csproj文件所在目录上
5、执行dotnet命令发布
dotnet publish -c release -r linux-x64 --self-contained /p:publishaot=true
到此这篇关于.net9 aot部署方案详解的文章就介绍到这了,更多相关.net9 aot部署内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论