Kompilasi AOT Asli
Dayakan AOT Asli dalam projek .NET, fahami analisis pemangkasan dan terbitkan perduaan asli kendiri.
Kompilasi AOT Asli ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Apakah AOT Asli?
Kompilasi AOT Asli secara terus menyusun app .NET anda menjadi perduaan asli kendiri semasa penerbitan. Tiada pengkompil JIT dan tiada masa jalan .NET diperlukan pada sasaran — hanya satu fail boleh laku.
Bila Hendak Menggunakan AOT Asli
AOT Asli amat sesuai untuk perkhidmatan mikro, alat CLI dan fungsi tanpa pelayan yang mementingkan masa permulaan serta jejak memori. AOT Asli kurang sesuai untuk app yang sangat bergantung pada pantulan semasa masa jalan.
// 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)Menerbitkan dengan AOT Asli
Dayakan AOT dalam fail projek dan terbitkan dengan dotnet publish. Outputnya ialah satu fail boleh laku asli tanpa kebergantungan masa jalan.
// .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 requiredAPI Minimum dengan AOT Asli
API Minimum ASP.NET Core menyokong AOT Asli sepenuhnya mulai .NET 8+. Gunakan templat dotnet new webapiaot sebagai titik permulaan yang telah diprakonfigurasi.
// 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 { }Penyirian JSON Dijana daripada Sumber
Native AOT tidak dapat menggunakan serialisasi JSON berasaskan refleksi. Anda mesti menggunakan penjanaan sumber System.Text.Json untuk menghasilkan kod serialisasi pada masa 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);Amaran Pemangkasan
Penerbitan dengan Native AOT mendayakan pemangkasan secara lalai. Pengkompil memberikan amaran apabila mengesan kod yang mungkin gagal selepas kod yang tidak digunakan dialih keluar. Anggap amaran pemangkasan sebagai ralat semasa 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 Keserasian AOT
Jalankan penganalisis keserasian AOT semasa pembangunan untuk mengesan laluan kod yang tidak serasi sebelum laluan tersebut menjadi kegagalan semasa penerbitan.
// 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 RequiresDynamicCodePerbandingan Prestasi Masa Mula
Native AOT mengurangkan masa permulaan dan penggunaan memori secara ketara berbanding aplikasi yang dikompil oleh JIT. Pertukarannya ialah masa penerbitan yang lebih lama dan saiz fail boleh laksana yang lebih besar untuk sesetengah 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 savingsContoh Dunia Sebenar: Fungsi Lambda dengan AOT
Fungsi Lambda Native AOT yang menggunakan pakej rasmi Amazon.Lambda.RuntimeSupport untuk prestasi permulaan sejuk yang 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\"}" };
}Semakan Pantas
Mengapakah anda mesti menggunakan penjanaan sumber System.Text.Json dan bukannya serialisasi berasaskan refleksi dengan Native AOT?
Ringkasan: Kompilasi Native AOT
Kesimpulan utama:
- Native AOT mengkompil kepada perduaan natif kendiri — tiada masa jalan diperlukan
- Sesuai untuk tanpa pelayan, perkhidmatan mikro dan alat CLI (permulaan pantas, penggunaan memori rendah)
- Dayakan dengan
<PublishAot>true</PublishAot>dan terbitkan dengan-r <rid> - Mesti menggunakan penjanaan sumber System.Text.Json — serialisasi refleksi tidak akan berfungsi
- Gunakan
EnableAotAnalyzeruntuk mengesan isu keserasian semasa pembangunan - Pertukaran: masa penerbitan lebih lama dan batasan refleksi, tetapi permulaan sejuk 5-35x lebih pantas
Pelajari C# dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Soalan Lazim
Adakah pelajaran “Kompilasi AOT Asli” percuma?
Ya — teks penuh “Kompilasi AOT Asli” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Kompilasi AOT Asli”?
Dayakan AOT Asli dalam projek .NET, fahami analisis pemangkasan dan terbitkan perduaan asli kendiri. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Kompilasi AOT Asli” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?
Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Kompilasi AOT Asli
- Had Pemangkasan & Pantulan
- ReadyToRun & Kompilasi Berperingkat
- Penanda Aras dengan BenchmarkDotNet