تكرار السؤال: …
الإجابة المختصرة
توفر نطاق عزل لتحميل ملفات .dll مستقلة مع إمكانية تفريغها بالكامل من الذاكرة (Collectibility) عند الانتهاء دون إيقاف العملية الرئيسية.
الشرح
افتراضياً في .NET، لا يمكن تفريغ أي تجميعة (Assembly) يتم تحميلها في الـ Default Context حتى تموت العملية بأكملها. باستخدام فئة مشتقة من AssemblyLoadContext محددة بـ isCollectible: true، يمكنك تحميل إضافات برمجية خارجية، وتشغيلها، ثم استدعاء alc.Unload() والتأكد من إزالة كل المراجع ليقوم الـ GC بمسح التجميعة بالكامل من الرام.
مثال بالكود
var alc = new AssemblyLoadContext("PluginContext", isCollectible: true);
var assembly = alc.LoadFromAssemblyPath(pluginPath);
// تنفيذ الكود ثم التفريغ
alc.Unload();أخطاء شائعة
- الاحتفاظ بمراجع غير مباشرة لكائنات أو أنواع قادمة من الـ Plugin في الـ Host الرئيسي مما يمنع تفريغ الـ Context.
أسئلة متابعة
- كيف تشخص أعطال الذاكرة والـ Deadlocks في بيئات الإنتاج بـ Linux باستخدام dotnet-dump و dotnet-trace؟