將您的應用程式發佈為 原生 AOT 將產生一個 獨立 並已經預先編譯為原生程式碼的應用程式。 原生 AOT 應用程式有更快的啟動時間和較小的記憶體使用量。 這些應用程式可以在未安裝 .NET 運行時間的計算機上執行。
原生 AOT 的優點對於具有大量已部署實例的工作負載而言最為重要,例如雲端基礎結構和超大規模服務。 .NET 8 新增 原生 AOT 的 ASP.NET Core 支援。
原生 AOT 部署模型使用預先編譯器,在發佈時將 IL 編譯為本機碼。 原生 AOT 應用程式在執行應用程式時不會使用 Just-In-Time (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,示範如何使用容器將必要條件安裝自動化,並使用原生 AOT 發佈 .NET 專案。
AOT 相容性分析器
屬性 IsAotCompatible
是用來指出連結庫是否與 Native AOT 相容。 請考慮當連結庫將 IsAotCompatible
屬性設定為 true
時,例如:
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
上述組態會將 預設值 true
指派給下列屬性:
IsTrimmable
EnableTrimAnalyzer
EnableSingleFileAnalyzer
EnableAotAnalyzer
這些分析器可協助確保連結庫與原生 AOT 相容。
原生偵錯資訊
根據預設,原生 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 原生 AOT 的核心支援。
發佈過程會分析整個專案及其相依性,以找出可能的限制。 針對已發佈應用程式在運行時間可能會遇到的每個限制發出警告。
平臺/架構限制
下表顯示支持的編譯目標。
平台 | 支援的架構 | 備註 |
---|---|---|
窗戶 | x64、Arm64 | |
Linux | x64、Arm64 | |
macOS | x64、Arm64 | |
iOS | Arm64 | 實驗性支援 |
iOSSimulator | x64、Arm64 | 實驗性支援 |
tvOS | Arm64 | 實驗性支援 |
tvOSSimulator | x64、Arm64 | 實驗性支援 |
MacCatalyst | x64、Arm64 | 實驗性支援 |
安卓 | x64、Arm64 | 實驗性,沒有內建的Java Interop |
如需原生 AOT 支援特定平台的詳細資訊,請遵循數據表中的連結。