
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,就像发布自包含应用程序一样。
AOT是将C#程序提前编译为机器代码(通常为平台特定的二进制文件),在应用程序启动之前完成编译过程。
JIT是在应用程序运行时将中间语言(IL)编译为机器代码,编译过程是动态发生的。
选择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即可,其它平台看场景发布命令参考:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/ready-to-run
https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-publish
使用cmd进入到在csproj文件夹目录,执行dotnet命令
dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
如果直接在VS 2022上发布到Liunx的AOT部署会报下面错误
Cross-OS native compilation is not supported.
参考文档:
添加存储库
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
参考文档:https://www.jb51.net/aspnet/334718iq4.htm
下载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
# 查看版本 dotnet --version # 检查 SDK 版本 dotnet --list-sdks # 检查运行时版本 dotnet --list-runtimes
参考文档:
https://www.jb51.net/aspnet/334726wux.htm
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/?tabs=linux-ubuntu%2Cnet9plus
sudo apt-get install clang zlib1g-dev
dotnet publish -c Release -r linux-x64 --self-contained /p:PublishAot=true
到此这篇关于.NET9 AOT部署方案详解的文章就介绍到这了,更多相关.NET9 AOT部署内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!