.NET9?AOT部署方案詳解
概念
AOT是Ahead-of-Time的縮寫,AOT是將C#程序提前編譯為機器代碼(通常為平臺特定的二進制文件),在應用程序啟動之前完成編譯過程。
微軟官方文檔是這樣說的
將應用程序發(fā)布為本機 AOT 會生成一個自包含的應用程序,并且已提前 (AOT) 編譯為本機代碼。原生 AOT 應用程序具有更快的啟動時間和更小的內(nèi)存占用。這些應用可以在未安裝 .NET 運行時的計算機上運行。 原生 AOT 的優(yōu)勢對于具有大量已部署實例的工作負載(例如云基礎(chǔ)設施和超大規(guī)模服務)最為明顯。.NET 8 添加了對本機 AOT 的 ASP.NET Core 支持。 本機 AOT 部署模型使用預先編譯器在發(fā)布時將 IL 編譯為本機代碼。本機 AOT 應用程序在應用程序運行時不使用實時 (JIT) 編譯器。本機 AOT 應用程序可以在不允許 JIT 的受限環(huán)境中運行。本機 AOT 應用程序以特定的運行時環(huán)境為目標,例如 Linux x64 或 Windows x64,就像發(fā)布自包含應用程序一樣。
C# AOT部署和JIT部署兩種不同的編譯和部署方式對比
AOT(Ahead-of-Time)部署:
AOT是將C#程序提前編譯為機器代碼(通常為平臺特定的二進制文件),在應用程序啟動之前完成編譯過程。
優(yōu)點:
- 啟動速度快:由于已經(jīng)提前編譯成機器代碼,應用程序可以直接執(zhí)行,減少了啟動時的編譯延遲。
- 內(nèi)存占用低:不需要在運行時為JIT編譯分配額外內(nèi)存,避免了JIT編譯過程中可能的內(nèi)存開銷。
- 跨平臺支持:AOT編譯后,可以生成特定平臺的本地代碼,能夠更好地支持跨平臺部署。
- 安全性:由于所有的代碼已經(jīng)提前編譯為機器代碼,JIT編譯的潛在安全風險(如代碼注入等)較少。
- 性能穩(wěn)定:AOT編譯會優(yōu)化代碼,尤其適用于性能要求嚴格的場景,能夠提供更穩(wěn)定的執(zhí)行性能。
缺點:
- 編譯時間長:AOT需要在部署前進行編譯,可能導致部署的時間較長。
- 平臺依賴:AOT編譯會生成特定平臺的機器碼,因此跨平臺部署需要針對每個平臺生成不同版本的代碼。
- 靈活性較低:JIT可以根據(jù)運行時的環(huán)境和數(shù)據(jù)進行動態(tài)優(yōu)化,而AOT在編譯時就決定了優(yōu)化策略,缺乏運行時調(diào)整的靈活性。
JIT(Just-in-Time)部署:
JIT是在應用程序運行時將中間語言(IL)編譯為機器代碼,編譯過程是動態(tài)發(fā)生的。
優(yōu)點:
- 快速開發(fā):JIT編譯能夠即時將中間語言編譯為本地代碼,因此可以更靈活地進行開發(fā)和調(diào)試。
- 跨平臺支持:通過運行時環(huán)境(如.NET Core或Mono),JIT可以支持多平臺的代碼編譯,而不需要為每個平臺單獨編譯。
- 運行時優(yōu)化:JIT可以根據(jù)應用程序的運行環(huán)境和具體數(shù)據(jù)動態(tài)生成優(yōu)化的機器代碼,可能會實現(xiàn)更高的性能,尤其是在具有不同負載的應用場景下。
- 更高的靈活性:JIT可以在運行時處理平臺和硬件特性,為應用程序生成最合適的代碼。
缺點:
- 啟動時間慢:JIT編譯需要在運行時將代碼編譯為機器代碼,因此啟動速度較慢,特別是在初次運行時。
- 額外內(nèi)存開銷:JIT編譯需要在內(nèi)存中保存編譯生成的機器代碼,這可能導致內(nèi)存占用較高。
- 性能波動:由于JIT編譯是在運行時進行的,可能導致執(zhí)行過程中存在性能波動,尤其是在復雜的代碼路徑上。
總結(jié):
- AOT部署適用于需要快速啟動、內(nèi)存占用較低、性能要求穩(wěn)定的場景,例如嵌入式設備或資源受限的應用。它的主要缺點是編譯時間較長以及缺乏運行時優(yōu)化的靈活性。
- JIT部署適用于需要較高靈活性、支持多平臺和快速開發(fā)的場景,它能動態(tài)優(yōu)化性能,但啟動時間較長,并可能帶來額外的內(nèi)存開銷。
選擇AOT還是JIT部署,需要根據(jù)具體的應用場景、性能需求、開發(fā)周期和平臺要求來權(quán)衡。
實操
創(chuàng)建一個解決方案,創(chuàng)建兩個控制臺項目,一個啟用AOT,一個不啟用
未啟用AOT的csproj文件內(nèi)容
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
啟用AOT的csproj文件內(nèi)容
<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>
通過對比可以發(fā)現(xiàn)就這個配置
<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>
此屬性在發(fā)布期間啟用本機 AOT 編譯<IsAotCompatible>true</IsAotCompatible>
該屬性用于指示庫是否與本機 AOT 兼容<StripSymbols>false</StripSymbols>
調(diào)試文件對于在調(diào)試器下運行應用程序或檢查故障轉(zhuǎn)儲是必需的。在類 Unix 平臺上,將該屬性設置為在本機二進制文件中包含調(diào)試信息。包含調(diào)試信息會使本機二進制文件更大<PlatformTarget>x64</PlatformTarget>
目標平臺內(nèi)容是AnyCPU、x86、x64、ARM32、ARM64,一般選擇x64/AnyCPU即可,其它平臺看場景
發(fā)布到Win系統(tǒng)的AOT
發(fā)布命令參考:
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進行發(fā)布
2.使用dotnet命令
使用cmd進入到在csproj文件夾目錄,執(zhí)行dotnet命令
dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
發(fā)布到Liunx系統(tǒng)的AOT
如果直接在VS 2022上發(fā)布到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
#可執(zhí)行文件運行的權(quán)限 chmod +x ./dotnet-install.sh
此腳本默認安裝最新的長期支持 (LTS) SDK 版本,即 .NET 8。 若要安裝最新版本(可能不是 (LTS) 版本),請使用 --version latest 參數(shù)。
./dotnet-install.sh --version latest # 若要安裝 .NET 運行時而非 SDK,請使用 --runtime 參數(shù)。 ./dotnet-install.sh --version latest --runtime aspnetcore # 可以通過 --channel 參數(shù)更改特定主要版本來指示特定版本。 以下命令安裝 .NET 9.0 SDK。 ./dotnet-install.sh --channel 9.0
手動安裝
參考文檔:http://www.dbjr.com.cn/aspnet/334718iq4.htm
下載SDK/runtime地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/9.0
這里下載的是dotnet-sdk-9.0.102-linux-x64.tar.gz
# 創(chuàng)建文件夾 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文件下增加下面內(nèi)容 export DOTNET_HOME=/usr/dotnet/9.0.102 export PATH=${DOTNET_HOME}:$PATH # 重新加載系統(tǒng)級別的環(huán)境配置文件 source /etc/profile
2、檢查安裝.NET的版本
# 查看版本 dotnet --version # 檢查 SDK 版本 dotnet --list-sdks # 檢查運行時版本 dotnet --list-runtimes
3、 安裝C++編譯工具
參考文檔:
http://www.dbjr.com.cn/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
4、把解決方案代碼上傳到Linux系統(tǒng)某個文件夾上并轉(zhuǎn)到要發(fā)布的項目csproj文件所在目錄上
5、執(zhí)行dotnet命令發(fā)布
dotnet publish -c Release -r linux-x64 --self-contained /p:PublishAot=true
到此這篇關(guān)于.NET9 AOT部署方案詳解的文章就介紹到這了,更多相關(guān).NET9 AOT部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET連接 Access數(shù)據(jù)庫的幾種方法
這篇文章主要介紹了ASP.NET連接 Access數(shù)據(jù)庫的幾種方法,每種方法都非常不錯,具有參考借鑒價值,需要的朋友一起學習吧2016-08-08asp.net jQuery Ajax用戶登錄功能的實現(xiàn)
前幾天把jbox源碼修改成仿QQ空間模擬窗口后發(fā)現(xiàn)有很多人在關(guān)注。今天就貼一下我利用該模擬窗口實現(xiàn)的用戶登錄功能的代碼。2009-11-11使用ajax局部刷新gridview進行數(shù)據(jù)綁定示例
很多用戶都有這樣需求,比如:點擊按鈕,刷新 GridView 中的數(shù)據(jù),而不是這個頁面刷新。使用簡單的 XMLHttpRequest就可以直接實現(xiàn)2014-02-02ASP.NET服務器端控件RadioButtonList,DropDownList,CheckBoxList的取值、賦值
這三個控件都有一個Items集合,可以用 RepeatLayout 和 RepeatDirection 屬性來控制列表的呈現(xiàn)形式2013-10-10