Native AOT
În mod implicit, un program C# este compilat într-un cod intermediar MSIL. Pentru a rula un astfel de program, este necesar ca pe computer să fie instalat framework-ul .NET. Cu toate acestea, .NET SDK permite de asemenea compilarea unui proiect C# într-o aplicație nativă, care nu utilizează compilarea JIT și poate fi rulată pe un computer fără .NET instalat.
Acest model se numește Native AOT și este disponibil începând cu .NET 7 (pentru proiecte console). Suportul pentru ASP.NET Core și MacOS a fost adăugat în .NET 8.0.
Pentru a utiliza Native AOT, este necesară instalarea unor instrumente suplimentare. Pe Windows, prin instalatorul Visual Studio, trebuie instalată încărcătura "Desktop development with C++" (Dezvoltarea aplicațiilor clasice pe C++).

Pentru a specifica faptul că proiectul va folosi modelul de publicare Native AOT, în fișierul proiectului, în elementul PropertyGroup, trebuie adăugat elementul <PublishAot>true</PublishAot>:
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
Pentru compilarea folosind .NET CLI se folosește următoarea comandă:
dotnet publish -r <RID>
În particular, câțiva identificatori comuni sunt Pentru Windows:
- win-x64
- win-x86
- win-arm64
Pentru Linux:
- linux-x64
- linux-arm64
Pentru MacOS:
- osx-x64
- osx-arm64
Lista completă a identificatorilor poate fi găsită la adresa: https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
De exemplu, pentru compilarea unei aplicații pentru Windows pe 64 de biți, se utilizează comanda:
dotnet publish -r win-x64 -c Release
Să luăm, de exemplu, un proiect simplu de aplicație console. Mai întâi, adăugăm în fișierul proiectului csproj parametrii:
<PublishAot>true</PublishAot>

Accesăm în consola folderul proiectului. Să presupunem că trebuie să compilăm aplicația pentru Windows pe 64 de biți. Pentru aceasta, executăm comanda:
dotnet publish -r win-x64 -c Release
Ca rezultat, vom obține următorul output în consolă:
C:\Users\Petrea\source\repos>cd C:\Users\Petrea\source\repos\FDCApp\FDCApp
C:\Users\Petrea\source\repos\FDCApp\FDCApp>dotnet publish -r win-x64 -c Release
Determining projects to restore...
All projects are up-to-date for restore.
FDCApp -> C:\Users\Petrea\source\repos\FDCApp\FDCApp\bin\Release\net8.0\win-x64\FDCApp.dll
FDCApp -> C:\Users\Petrea\source\repos\FDCApp\FDCApp\bin\Release\net8.0\win-x64\publish\
C:\Users\Petrea\source\repos\FDCApp\FDCApp>
După aceasta, în proiect, în folderul bin\Release\netX.X\win-x64\publish\ se poate găsi aplicația compilată.

În final, fișierul executabil (exe) compilat poate fi rulat pe sisteme Windows pe 64 de biți, chiar și acolo unde .NET nu este instalat.
Unul dintre principalele dezavantaje ale compilării într-o aplicație nativă este dimensiunea acesteia. De exemplu, așa cum se vede în captura de ecran, la compilarea cu .NET 8.0 Preview, o simplă aplicație console, care afișează o linie în consolă, ocupă 1793 KB.
Cu toate acestea, merită menționat că, comparativ cu .NET 7.0, în .NET 8.0 dimensiunea aplicației native a fost semnificativ redusă, iar echipa de dezvoltare .NET continuă să lucreze la acest aspect, astfel încât dimensiunea aplicației ar putea scădea semnificativ în viitor.
În plus, se pot aplica diferite optimizări. Cea mai simplă este utilizarea modului invariant pentru parametrii de globalizare, pentru care trebuie adăugată în fișierul proiectului următoarea setare:
<InvariantGlobalization>true</InvariantGlobalization>
Astfel, doar această setare a permis în cazul meu reducerea dimensiunii aplicației de la 1793 KB la 1567 KB.
În plus față de dimensiunea mai mare, merită menționat și alte dezavantaje ale acestui model de publicare. În primul rând, nu este disponibil pentru toate tipurile de proiecte, biblioteci și medii. De exemplu, suportul pentru aplicațiile console a fost adăugat de la început, în .NET 7.0. Pentru ASP.NET Core, acest model este disponibil doar începând cu .NET 8.0.
De asemenea, pentru astfel de aplicații native, încărcarea dinamică a bibliotecilor (de exemplu, folosind metoda Assembly.LoadFile) nu este disponibilă.