Back to Aspnetcore

Tutorial: Publish an ASP.NET Core app using Native AOT

aspnetcore/fundamentals/aot/native-aot-tutorial.md

latest6.2 KB
Original Source

Tutorial: Publish an ASP.NET Core app using Native AOT

.NET native ahead-of-time (AOT) is available in ASP.NET Core.

[!NOTE] Minimal APIs are not compatible with native AOT.

See Native AOT deployment for more information, including:

Prerequisites

.NET CLI

<!-- explicitly specify SDK version or we could just list https://dotnet.microsoft.com//download and tell them to install the version they're targeting -->

[!NOTE] Visual Studio 2022 is required because Native AOT requires link.exe and the Visual C++ static runtime libraries. There are no plans to support Native AOT without Visual Studio.

Visual Studio

.NET SDK

  • Visual Studio 2022 with the following workloads installed:

    • ASP.NET and web development
    • Desktop development with C++


Create a web app with Native AOT

Create an ASP.NET Core API app that is configured to work with Native AOT:

.NET CLI

Run the following commands:

dotnetcli
dotnet new webapiaot -o MyFirstAotWebApi && cd MyFirstAotWebApi

Output similar to the following example is displayed:

output
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.

Visual Studio

  1. Create a new ASP.NET Core Web API (Native AOT) project.
  2. Name the project MyFirstAotWebApi.
  3. Select Create.

Publish the Native AOT app

Verify the app can be published using Native AOT:

.NET CLI

dotnetcli
dotnet publish

Visual Studio

Visual studio doesn't support publishing an AOT app. Use the CLI command:

dotnetcli
dotnet publish

The dotnet publish command:

  • Compiles the source files.
  • Generates source code files that are compiled.
  • Passes generated assemblies to a native IL compiler. The IL compiler produces the native executable. The native executable contains the native machine code.

Output similar to the following example is displayed:

output
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\

The output may differ from the preceding example depending on the version of .NET 8 used, directory used, and other factors.

Review the contents of the output directory:

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

Output similar to the following example is displayed:

Output
    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

The executable is self-contained and doesn't require a .NET runtime to run. When launched, it behaves the same as the app run in the Development environment. Run the AOT app:

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

Output similar to the following example is displayed:

output
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

[!INCLUDE]

See also