Condividi tramite


Distribuzione AOT nativa

La pubblicazione della tua app come Native AOT produce un'applicazione autonoma che è stata compilata in modalità anticipata nel codice nativo. Le app AOT native hanno tempi di avvio più rapidi e footprint di memoria più piccoli. Queste app possono essere eseguite nei computer in cui non è installato il runtime .NET.

Il vantaggio di AOT nativo è molto significativo per i carichi di lavoro con un numero elevato di istanze distribuite, ad esempio l'infrastruttura cloud e i servizi con iper scalabilità. .NET 8 aggiunge il supporto di ASP.NET Core per AOT nativo.

Il modello di distribuzione AOT nativo usa un compilatore in anticipo per compilare IL in codice nativo al momento della pubblicazione. Le app AOT native non usano un compilatore JIT (Just-In-Time) quando l'applicazione viene eseguita. Le app AOT native possono essere eseguite in ambienti con restrizioni in cui non è consentito un JIT. Le applicazioni AOT native sono destinate a un ambiente di runtime specifico, ad esempio Linux x64 o Windows x64, proprio come la pubblicazione di un'app autonoma.

Prerequisiti

Visual Studio 2022, incluso il carico di lavoro Sviluppo di applicazioni desktop con C++ con tutti i componenti predefiniti.

Pubblicare AOT nativo usando la CLI

  1. Aggiungere <PublishAot>true</PublishAot> al file di progetto.

    Questa proprietà abilita la compilazione AOT nativa durante la pubblicazione. Consente anche l'analisi dinamica dell'utilizzo del codice durante la compilazione e la modifica. È preferibile inserire questa impostazione nel file di progetto anziché passarla alla riga di comando, perché controlla i comportamenti all'esterno della pubblicazione.

    <PropertyGroup>
        <PublishAot>true</PublishAot>
    </PropertyGroup>
    
  2. Pubblica l'applicazione per un identificatore di runtime specifico utilizzando dotnet publish -r <RID>.

    L'esempio seguente pubblica l'app per Windows come applicazione AOT nativa in un computer con i prerequisiti necessari installati.

    dotnet publish -r win-x64 -c Release

    L'esempio seguente pubblica l'app per Linux come applicazione AOT nativa. Un file binario AOT nativo prodotto nel computer Linux funziona solo nella stessa versione linux o successiva. Ad esempio, il file binario AOT nativo prodotto in Ubuntu 20.04 verrà eseguito in Ubuntu 20.04 e versioni successive, ma non verrà eseguito in Ubuntu 18.04.

    dotnet publish -r linux-arm64 -c Release

L'app è disponibile nella directory di pubblicazione e contiene tutto il codice necessario per eseguirlo, inclusa una versione rimossa del runtime coreclr.

Consulta gli esempi di AOT nativi disponibili nel repository dotnet/samples su GitHub. Gli esempi includono Linux e Windows Dockerfile che illustrano come automatizzare l'installazione dei prerequisiti e pubblicare progetti .NET con AOT nativo usando contenitori.

Analizzatori di compatibilità AOT

La IsAotCompatible proprietà viene utilizzata per indicare se una libreria è compatibile con AOT nativo. Si consideri quando una libreria imposta la IsAotCompatible proprietà su true, ad esempio:

<PropertyGroup>
    <IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

La configurazione precedente assegna un valore predefinito alle true proprietà seguenti:

  • IsTrimmable
  • EnableTrimAnalyzer
  • EnableSingleFileAnalyzer
  • EnableAotAnalyzer

Questi analizzatori consentono di garantire che una libreria sia compatibile con AOT nativo.

Informazioni di debug nativi

Per impostazione predefinita, la pubblicazione AOT nativa produce informazioni di debug in un file separato:

  • Linux: .dbg
  • Windows: .pdb
  • macOS: cartella dSYM

Il file di debug è necessario per eseguire l'app nel debugger o ispezionare i dump di crash. Nelle piattaforme simili a Unix impostare la StripSymbols proprietà su false per includere le informazioni di debug nel file binario nativo. L'inclusione delle informazioni di debug rende il file binario nativo più grande.

<PropertyGroup>
    <StripSymbols>false</StripSymbols>
</PropertyGroup>

Limitazioni della distribuzione AOT nativa

Le app AOT native presentano le limitazioni seguenti:

  • Nessun caricamento dinamico, Assembly.LoadFilead esempio .
  • Nessuna generazione di codice in fase di esecuzione, System.Reflection.Emitad esempio .
  • Nessun C++/CLI.
  • Windows: nessun COM predefinito.
  • Richiede il taglio, che ha delle limitazioni.
  • Implica la compilazione in un unico file, che presenta incompatibilità note.
  • Le app includono librerie di runtime necessarie (proprio come le app autonome, aumentandone le dimensioni rispetto alle app dipendenti dal framework).
  • System.Linq.Expressions usare sempre il formato interpretato, che è più lento rispetto al codice compilato generato in fase di esecuzione.
  • I parametri generici sostituiti con argomenti di tipo struct avranno codice specializzato generato per ogni istanziazione. Nel runtime dinamico vengono generate molte istanze su richiesta. In Native AOT, tutte le istanze sono generate in anticipo. Ciò può avere un impatto significativo sulle dimensioni del disco dell'applicazione. I metodi virtuali generici e i metodi di istanza generica avranno anche un'istanza per ogni tipo di implementazione o override.
  • Non tutte le librerie di runtime sono completamente annotate per essere compatibili con AOT nativo. Ovvero, alcuni avvisi nelle librerie di runtime non sono utilizzabili dagli sviluppatori finali.
  • Supporto diagnostico per il debug e la profilatura con alcune limitazioni.
  • Supporto per alcune funzionalità di ASP.NET Core. Per altre informazioni, vedere supporto di ASP.NET Core per AOT nativo.

Il processo di pubblicazione analizza l'intero progetto e le relative dipendenze per individuare eventuali limitazioni. Gli avvisi vengono generati per ogni limitazione che l'app pubblicata potrebbe incontrare durante l'esecuzione.

Restrizioni relative alla piattaforma/architettura

La tabella seguente mostra le destinazioni di compilazione supportate.

Piattaforma Architettura supportata Note
Finestre x64, Arm64
Linux x64, Arm64
macOS x64, Arm64
Ios Arm64 Supporto sperimentale
iOSSimulator x64, Arm64 Supporto sperimentale
tvOS Arm64 Supporto sperimentale
tvOSSimulator x64, Arm64 Supporto sperimentale
MacCatalyst x64, Arm64 Supporto sperimentale
Androide x64, Arm64 Sperimentale, nessuna interoperabilità predefinita con Java

Per altre informazioni su come è supportata una piattaforma specifica con AOT nativo, seguire il collegamento dalla tabella.