Esercitazione: Pubblicare un'app ASP.NET Core con AOT nativo

ASP.NET Core 8.0 introduce il supporto per .NET Native ahead-of-time (AOT).

Nota

  • La funzionalità AOT nativa è attualmente in anteprima.
  • In .NET 8, non tutte le funzionalità di ASP.NET Core sono compatibili con Native AOT.
  • Le schede sono disponibili per le istruzioni dell'interfaccia della riga di comando di .NET e di Visual Studio :
    • Visual Studio è un prerequisito anche se è selezionata la scheda dell'interfaccia della riga di comando.
    • L'interfaccia della riga di comando deve essere usata per pubblicare anche se è selezionata la scheda di Visual Studio.

Prerequisiti

Nota

Visual Studio 2022 Preview è necessario perché AOT nativo richiede link.exe e le librerie di runtime statiche di Visual C++. Non sono previsti piani per il supporto di AOT nativo senza Visual Studio.

Creare un'app Web con AOT nativo

Creare un'app per le API core ASP.NET configurata per l'uso con AOT nativo:

Eseguire i comandi seguenti:

dotnet new webapiaot -o MyFirstAotWebApi && cd MyFirstAotWebApi

Viene visualizzato un output simile all'esempio seguente:

The template "ASP.NET Core Web API (Native AOT)" was created successfully.

Processing post-creation actions...
Restoring C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj:
  Determining projects to restore...
  Restored C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj (in 302 ms).
Restore succeeded.

Pubblicare l'app AOT nativa

Verificare che l'app possa essere pubblicata con AOT nativo:

dotnet publish

Il comando dotnet publish:

  • Compila i file di origine.
  • Genera file di codice sorgente compilati.
  • Passa gli assembly generati a un compilatore IL nativo. Il compilatore IL produce l'eseguibile nativo. L'eseguibile nativo contiene il codice nativo del computer.

Viene visualizzato un output simile all'esempio seguente:

MSBuild version 17.<version> for .NET
  Determining projects to restore...
  Restored C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj (in 241 ms).
C:\Code\dotnet\aspnetcore\.dotnet\sdk\8.0.<version>\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIde
ntifierInference.targets(287,5): message NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotne
t-support-policy [C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj]
  MyFirstAotWebApi -> C:\Code\Demos\MyFirstAotWebApi\bin\Release\net8.0\win-x64\MyFirstAotWebApi.dll
  Generating native code
  MyFirstAotWebApi -> C:\Code\Demos\MyFirstAotWebApi\bin\Release\net8.0\win-x64\publish\

L'output può differire dall'esempio precedente a seconda della versione di .NET 8 usata, della directory usata e di altri fattori.

Esaminare il contenuto della directory di output:

dir bin\Release\net8.0\win-x64\publish

Viene visualizzato un output simile all'esempio seguente:

    Directory: C:\Code\Demos\MyFirstAotWebApi\bin\Release\net8.0\win-x64\publish

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          30/03/2023  1:41 PM        9480704 MyFirstAotWebApi.exe
-a---          30/03/2023  1:41 PM       43044864 MyFirstAotWebApi.pdb

L'eseguibile è indipendente e non richiede l'esecuzione di un runtime .NET. Al momento dell'avvio, si comporta come l'app eseguita nell'ambiente di sviluppo. Eseguire l'app AOT:

.\bin\Release\net8.0\win-x64\publish\MyFirstAotWebApi.exe

Viene visualizzato un output simile all'esempio seguente:

info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Code\Demos\MyFirstAotWebApi

Librerie e AOT nativo

Molte delle librerie più diffuse usate nei progetti ASP.NET Core presentano attualmente alcuni problemi di compatibilità quando vengono usati in un progetto destinato a AOT nativo, ad esempio:

  • Uso della reflection per esaminare e individuare i tipi.
  • Caricamento condizionale delle librerie in fase di esecuzione.
  • Generazione di codice in tempo reale per implementare la funzionalità.

Le librerie che usano queste funzionalità dinamiche devono essere aggiornate per lavorare con AOT nativo. Possono essere aggiornati usando strumenti come generatori di origine Roslyn.

Gli autori di librerie che sperano di supportare native AOT sono invitati a:

Vedi anche