Tutorial: Publish an ASP.NET Core app using Native AOT
ASP.NET Core 8.0 introduces support for .NET native ahead-of-time (AOT).
Note
- The Native AOT feature is currently in preview.
- In .NET 8, not all ASP.NET Core features are compatible with Native AOT.
- Tabs are provided for the .NET CLI and Visual Studio instructions:
- Visual Studio is a prerequisite even if the CLI tab is selected.
- The CLI must be used to publish even if the Visual Studio tab is selected.
Prerequisites
On Linux, see Prerequisites for Native AOT deployment.
Visual Studio 2022 Preview with the Desktop development with C++ workload installed.
Note
Visual Studio 2022 Preview 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.
Create a web app with Native AOT
Create an ASP.NET Core API app that is configured to work with Native AOT:
Run the following commands:
dotnet new webapiaot -o MyFirstAotWebApi && cd MyFirstAotWebApi
Output similar to the following example is displayed:
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.
Publish the Native AOT app
Verify the app can be published using Native AOT:
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:
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:
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:
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
Libraries and Native AOT
Many of the popular libraries used in ASP.NET Core projects currently have some compatibility issues when used in a project targeting Native AOT, such as:
- Use of reflection to inspect and discover types.
- Conditionally loading libraries at runtime.
- Generating code on the fly to implement functionality.
Libraries using these dynamic features need to be updated in order to work with Native AOT. They can be updated using tools like Roslyn source generators.
Library authors hoping to support Native AOT are encouraged to:
See also
- ASP.NET Core support for Native AOT
- Native AOT deployment
- Using the configuration binder source generator
- The minimal API AOT compilation template
- Comparing
WebApplication.CreateBuilder
toCreateSlimBuilder
- Exploring the new minimal API source generator
- Replacing method calls with Interceptors
- Configuration-binding source generator