0Pricing
C# Academy · Pelajaran

Kompilasi Native AOT

Aktifkan Native AOT dalam proyek .NET, pahami analisis trimming, dan publikasikan biner native mandiri.

Kompilasi Native AOT adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Apa Itu AOT Asli?

Kompilasi AOT asli (sebelum waktu eksekusi) mengompilasi aplikasi .NET Anda menjadi biner asli yang mandiri saat publikasi. Tidak ada kompilator JIT dan tidak diperlukan lingkungan .NET pada target — hanya satu berkas yang dapat dieksekusi.

Kapan Menggunakan AOT Asli

AOT asli sangat cocok untuk layanan mikro, alat CLI, dan fungsi tanpa server yang mengutamakan waktu mulai dan jejak memori. Teknologi ini tidak ideal untuk aplikasi yang sangat bergantung pada refleksi saat program berjalan.

// Ideal use cases:
// - Serverless functions (AWS Lambda, Azure Functions)
// - High-throughput microservices (fast cold start)
// - CLI tools shipped as single-file executables
// - IoT / embedded scenarios

// Poor fit:
// - Apps using extensive reflection (e.g., dynamic proxies)
// - Apps loading plugins at runtime
// - Apps depending on libraries that don't support trimming

// Key benefits:
// - Sub-10ms startup time (vs 200-500ms for JIT)
// - Lower memory at startup (no JIT overhead)
// - Smaller attack surface (no JIT engine)

Mempublikasikan dengan AOT Asli

Aktifkan AOT dalam berkas proyek dan publikasikan dengan dotnet publish. Hasilnya adalah satu berkas asli yang dapat dieksekusi tanpa dependensi lingkungan eksekusi.

// .csproj:
<PropertyGroup>
  <PublishAot>true</PublishAot>
  <!-- Optional: disable invariant globalization for smaller binary -->
  <InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>

// Publish for Linux x64:
dotnet publish -r linux-x64 -c Release

// Publish for Windows x64:
dotnet publish -r win-x64 -c Release

// Output: bin/Release/net9.0/linux-x64/publish/MyApp
// Single executable, no dotnet runtime required

API Minimal dengan AOT Asli

API Minimal ASP.NET Core sepenuhnya mendukung AOT asli mulai .NET 8+. Gunakan templat dotnet new webapiaot sebagai titik awal yang telah dikonfigurasi sebelumnya.

// dotnet new webapiaot -n FastApi

// Program.cs generated template:
var builder = WebApplication.CreateSlimBuilder(args); // AOT-optimized

// Must register serialization context for AOT:
builder.Services.ConfigureHttpJsonOptions(opts =>
    opts.SerializerOptions.TypeInfoResolverChain.Insert(0,
        AppJsonSerializerContext.Default));

var app = builder.Build();
app.MapGet("/hello", () => new Message("Hello, Native AOT!"));
app.Run();

record Message(string Text);

[JsonSerializable(typeof(Message))]
internal partial class AppJsonSerializerContext : JsonSerializerContext { }

Serialisasi JSON yang Dihasilkan oleh Kode Sumber

Native AOT tidak dapat menggunakan serialisasi JSON berbasis refleksi. Anda harus menggunakan pembuatan kode sumber System.Text.Json untuk menghasilkan kode serialisasi pada waktu kompilasi.

// Define types to serialize:
public record Product(int Id, string Name, decimal Price);
public record OrderDto(int OrderId, List<Product> Items);

// Create a JsonSerializerContext for AOT:
[JsonSerializable(typeof(Product))]
[JsonSerializable(typeof(OrderDto))]
[JsonSerializable(typeof(List<Product>))]
internal partial class MyJsonContext : JsonSerializerContext { }

// Serialize / deserialize without reflection:
var json = JsonSerializer.Serialize(product, MyJsonContext.Default.Product);
var product = JsonSerializer.Deserialize(json, MyJsonContext.Default.Product);

Peringatan Pemangkasan

Publikasi dengan Native AOT mengaktifkan pemangkasan secara default. Kompiler memberikan peringatan ketika mendeteksi kode yang mungkin gagal setelah kode yang tidak digunakan dihapus. Perlakukan peringatan pemangkasan sebagai kesalahan selama CI.

// .csproj: treat warnings as errors in CI
<PropertyGroup>
  <PublishAot>true</PublishAot>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  <TrimmerRootDescriptor>TrimmerRoots.xml</TrimmerRootDescriptor>
</PropertyGroup>

// Suppressing a specific warning when you know it is safe:
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MyClass))]
public static void EnsureMyClassSurvivesTrimming() { }

// Or annotate parameters:
public static void Register(
    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
    Type serviceType) { }

Penganalisis Kompatibilitas AOT

Jalankan penganalisis kompatibilitas AOT selama pengembangan untuk menemukan jalur kode yang tidak kompatibel sebelum menjadi kegagalan saat publikasi.

// Enable analysis without actually publishing AOT:
<PropertyGroup>
  <EnableAotAnalyzer>true</EnableAotAnalyzer>
  <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
  <EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer>
</PropertyGroup>

// Run:
// dotnet build
// => analyzer reports issues in build output

// Common warnings:
// IL2026: member uses RequiresUnreferencedCode
// IL2046: member annotated with RequiresUnreferencedCode derives from unannotated
// IL3050: member uses RequiresDynamicCode

Perbandingan Kinerja Waktu Mulai

Native AOT secara drastis mengurangi waktu mulai dan penggunaan memori dibandingkan aplikasi yang dikompilasi dengan JIT. Imbalannya adalah waktu publikasi yang lebih lama dan ukuran berkas yang dapat dieksekusi yang lebih besar untuk beberapa beban kerja.

// Typical Minimal API measurements:
// JIT (.NET 9, linux-x64):
//   Startup time:  ~180ms
//   Memory (RSS):  ~60 MB
//   Publish time:  ~5s
//   Executable:    self-contained ~80 MB

// Native AOT (.NET 9, linux-x64):
//   Startup time:  ~5ms   (36x faster)
//   Memory (RSS):  ~20 MB (3x less)
//   Publish time:  ~30s   (6x slower to build)
//   Executable:    ~10 MB (8x smaller)

// For AWS Lambda / Azure Container Apps:
// AOT cold start: <10ms vs JIT: 300-500ms = significant billing savings

Dunia Nyata: Fungsi Lambda dengan AOT

Fungsi Lambda Native AOT yang menggunakan paket resmi Amazon.Lambda.RuntimeSupport untuk kinerja mulai dingin maksimum.

// dotnet new lambda.NativeAOT

// .csproj:
// <PublishAot>true</PublishAot>
// <StripSymbols>true</StripSymbols>

public class Function
{
    [JsonSerializable(typeof(APIGatewayProxyRequest))]
    [JsonSerializable(typeof(APIGatewayProxyResponse))]
    internal partial class LambdaContext : JsonSerializerContext { }

    static async Task Main()
    {
        Func<APIGatewayProxyRequest, ILambdaContext, APIGatewayProxyResponse>
            handler = FunctionHandler;

        await LambdaBootstrapBuilder
            .Create(handler, LambdaContext.Default.APIGatewayProxyRequest)
            .Build()
            .RunAsync();
    }

    static APIGatewayProxyResponse FunctionHandler(
        APIGatewayProxyRequest req, ILambdaContext ctx)
        => new() { StatusCode = 200, Body = "{\"status\":\"ok\"}" };
}

Pemeriksaan Singkat

Mengapa Anda harus menggunakan pembuatan kode sumber System.Text.Json, bukan serialisasi berbasis refleksi, dengan Native AOT?

Ringkasan: Kompilasi Native AOT

Hal penting:

  • Native AOT dikompilasi menjadi biner natif mandiri — tidak memerlukan lingkungan eksekusi
  • Ideal untuk layanan tanpa server, layanan mikro, dan alat CLI (waktu mulai cepat, penggunaan memori rendah)
  • Aktifkan dengan <PublishAot>true</PublishAot> dan publikasikan dengan -r <rid>
  • Harus menggunakan pembuatan kode sumber System.Text.Json — serialisasi refleksi tidak akan berfungsi
  • Gunakan EnableAotAnalyzer untuk menemukan masalah kompatibilitas selama pengembangan
  • Kompromi: waktu publikasi lebih lama dan keterbatasan refleksi, tetapi waktu mulai dingin 5–35 kali lebih cepat

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kompilasi Native AOT” gratis?

Ya — teks lengkap “Kompilasi Native AOT” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kompilasi Native AOT”?

Aktifkan Native AOT dalam proyek .NET, pahami analisis trimming, dan publikasikan biner native mandiri. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Kompilasi Native AOT” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kompilasi Native AOT
  2. Keterbatasan Trimming & Reflection
  3. ReadyToRun & Kompilasi Bertingkat
  4. Benchmark dengan BenchmarkDotNet
← Kembali ke C# Academy