الترجمة إلى Native AOT
فعّلوا Native AOT في مشروع .NET، وافهموا تحليل القصّ، وانشروا ملفًا ثنائيًا أصليًا مستقلًا.
الترجمة إلى Native AOT درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما المقصود بـ Native AOT؟
يُجمّع التجميع الأصلي مسبقًا (AOT) تطبيق .NET في ملف ثنائي أصلي مستقل ذاتيًا أثناء النشر. ولا يوجد مترجم JIT أو حاجة إلى .NET runtime على الهدف — بل ملف تنفيذي واحد فقط.
متى تستخدم Native AOT؟
يبرز Native AOT في الخدمات المصغّرة وأدوات CLI والدوال عديمة الخادم، حيث يكون زمن بدء التشغيل والبصمة الذاكرية مهمَّين. لكنه ليس مثاليًا للتطبيقات التي تعتمد بكثافة على الانعكاس أثناء التشغيل.
// 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)النشر باستخدام Native AOT
فعّل AOT في ملف المشروع وانشر باستخدام dotnet publish. ويكون الناتج ملفًا تنفيذيًا أصليًا واحدًا بلا اعتماد على runtime.
// .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 requiredMinimal API مع Native AOT
تدعم Minimal APIs في ASP.NET Core Native AOT دعمًا كاملًا بدءًا من .NET 8+. استخدم القالب dotnet new webapiaot كنقطة بداية معدّة مسبقًا.
// 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 { }تسلسل JSON المُولَّد من المصدر
لا يستطيع Native AOT استخدام تسلسل JSON المعتمد على الانعكاس. يجب استخدام توليد مصدر System.Text.Json لإنتاج كود التسلسل في وقت الترجمة.
// 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);تحذيرات التشذيب
يؤدي النشر باستخدام Native AOT إلى تفعيل التشذيب افتراضيًا. يُصدر المترجم تحذيرًا عند اكتشافه كودًا قد يفشل بعد إزالة الكود غير المستخدم. تعاملوا مع تحذيرات التشذيب بوصفها أخطاء أثناء 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) { }محلل توافق AOT
شغّلوا محلل توافق AOT أثناء التطوير لاكتشاف مسارات الكود غير المتوافقة قبل أن تتحول إلى حالات فشل وقت النشر.
// 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مقارنة أداء بدء التشغيل
يقلل Native AOT وقت بدء التشغيل واستهلاك الذاكرة بدرجة كبيرة مقارنةً بالتطبيقات المترجمة باستخدام JIT. والمقابل هو زيادة وقت النشر وحجم الملف التنفيذي في بعض أعباء العمل.
// 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من الواقع العملي: دالة Lambda باستخدام AOT
دالة Lambda تستخدم حزمة Amazon.Lambda.RuntimeSupport الرسمية لتحقيق أعلى أداء ممكن عند بدء التشغيل البارد.
// 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\"}" };
}تحقق سريع
لماذا يجب استخدام توليد مصدر System.Text.Json بدلًا من التسلسل المعتمد على الانعكاس مع Native AOT؟
مراجعة: الترجمة باستخدام Native AOT
أهم النقاط:
- يترجم Native AOT التطبيق إلى ملف ثنائي أصلي مستقل، لذلك لا يحتاج إلى بيئة تشغيل
- مثالي للتطبيقات عديمة الخوادم والخدمات المصغرة وأدوات CLI، بفضل سرعة بدء التشغيل وانخفاض استهلاك الذاكرة
- يُفعّل باستخدام
<PublishAot>true</PublishAot>، ثم يُنشر باستخدام-r <rid> - يجب استخدام توليد مصدر System.Text.Json، إذ لن يعمل التسلسل باستخدام الانعكاس
- استخدموا
EnableAotAnalyzerلاكتشاف مشكلات التوافق أثناء التطوير - المقابل: زيادة وقت النشر، وقيود الانعكاس، لكن بدء التشغيل البارد يصبح أسرع بمقدار 5 إلى 35 مرة
الأسئلة الشائعة
هل درس «الترجمة إلى Native AOT» مجاني؟
نعم — نص درس «الترجمة إلى Native AOT» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «الترجمة إلى Native AOT»؟
فعّلوا Native AOT في مشروع .NET، وافهموا تحليل القصّ، وانشروا ملفًا ثنائيًا أصليًا مستقلًا. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الترجمة إلى Native AOT»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الترجمة إلى Native AOT
- القصّ وقيود Reflection
- ReadyToRun والترجمة متعددة المستويات
- قياس الأداء باستخدام BenchmarkDotNet