原生 AOT 部署

將您的應用程式發佈為 原生 AOT 會產生獨立式且已預先 (AOT) 編譯成機器碼的應用程式。 原生 AOT 應用程式的啟動時間更快且磁碟使用量較小。 這些應用程式可以在未安裝 .NET 執行階段的機器上執行。

原生 AOT 的優點對於部署大量執行個體的工作負載而言最為重要,例如雲端基礎結構和超大規模服務。 .NET 8 新增 原生 AOT 的 ASP.NET Core 支援

原生 AOT 部署模型會使用預先編譯器,在發佈時將 IL 編譯為機器碼。 原生 AOT 應用程式在執行應用程式時,不會使用 Just-In-Time (JIT) 編譯器。 原生 AOT 應用程式可以在不允許 JIT 的限制環境中執行。 原生 AOT 應用程式的目標是特定的執行階段環境,例如 Linux x64 或 Windows x64,就像發佈獨立應用程式一樣。

.NET 原生 AOT 部署模型中的限制

原生 AOT 會以主控台型別應用程式為目標。 只有一定數目的程式庫與原生 AOT 完全相容。

必要條件

Visual Studio 2022,包括具有所有預設元件的 使用 C++ 的桌面開發 工作負載。

使用 CLI 發佈原生 AOT

  1. <PublishAot>true</PublishAot> 新增至您的專案檔。

    這屬性會在發佈期間啟用原生 AOT 編譯。 它也會在組建和編輯期間啟用動態程式碼使用方式分析。 最好將此設定放在專案檔中,而非在命令列傳遞,因為此設定可以控制發佈之外的行為。

    <PropertyGroup>
        <PublishAot>true</PublishAot>
    </PropertyGroup>
    
  2. 使用 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 範例。 這些範例包括 LinuxWindows Dockerfiles,示範如何使用容器並搭配原生 AOT,自動化必要條件的安裝和 .NET 專案的發佈。

AOT 相容性分析器

AOT 相容性分析器僅適用於 .NET 8 和更新版本。

原生偵錯資訊

原生 AOT 發佈會遵循原生工具鏈的平台慣例。 Windows 上原生工具鏈的預設行為是在個別的 .pdb 檔案中產生偵錯資訊。 Linux 上原生工具鏈的預設行為是將偵錯資訊納入原生二進位檔,這會讓原生二進位檔變大。

StripSymbols 屬性設定為 true,以在個別的 .dbg 檔案中產生偵錯資訊,並將它從 Linux 上的原生二進位檔中排除。 (這個屬性在 Windows 上沒有任何影響。)

<PropertyGroup>
    <StripSymbols>true</StripSymbols>
</PropertyGroup>

原生 AOT 部署的限制

原生 AOT 應用程式有下列限制:

  • 無法動態載入 (例如,Assembly.LoadFile)。
  • 無法產生執行階段程式碼 (例如,System.Reflection.Emit)。
  • 無 C++/CLI。
  • Windows: 沒有內建 COM。
  • 需要修剪,附有 限制
  • 表示編譯成單一檔案,其中有已知的不相容問題
  • 應用程式包含所需的執行階段程式庫 (就像獨立式應用程式一樣,相較於架構相依的應用程式,此應用程式的大小變得更大)。
  • System.Linq.Expressions 一律使用其解譯格式,其速度比執行階段產生的編譯程式碼慢。
  • 並非所有執行階段程式庫都完全標註為原生 AOT 相容。 也就是說,執行階段程式庫中的一些警告無法由終端開發人員採取動作。

發佈流程會分析整個專案及其相依性,以取得可能的限制。 針對已發佈應用程式在執行階段可能會遇到的每個限制發出警告。

版本特定限制

  • 應該以主控台型別應用程式為目標。 支援 ASP.NET Core。
  • 偵錯和分析的有限診斷支援。

建置原生程式庫

將 .NET 類別庫發佈為原生 AOT,可讓您建立可從非 .NET 程式設計語言取用的程式庫。 產生的原生程式庫是獨立式的,而且不需要安裝 .NET 執行階段。

將類別庫發佈為原生 AOT 會建立原生程式庫,其會公開以非 null EntryPoint 欄位以 UnmanagedCallersOnlyAttribute 標註之類別庫的方法。 如需詳細資訊,請參閱 GitHub 的 dotnet/samples 存放庫中的 原生程式庫範例

平台/結構限制

下表顯示支援的編譯目標。

平台 支援的結構
Windows x64、Arm64
Linux x64、Arm64