פרויקט מסכם: מארח רכיבים שניתנים לפריקה¶
נבנה מארח שמטעין רכיב לעיבוד byte-ים, מעביר אליו קובץ במקטעים, מסיים את חייו ובודק שהקשר הטעינה נעשה בר־איסוף. הפרויקט מחבר מערכת טיפוסים, בעלות על buffers, cleanup, מדידה וזהות assembly. המארח מיועד לרכיבים מהימנים בלבד, וה־API כולו סינכרוני בשלב הזה; בפרק הבא נרחיב את גבול ההשלמה והביטול.
צרו שלושה פרויקטים: Contract, Plugin ו־Host. החוזה יגדיר IPlugin עם Name, פעולה Accumulate שמקבלת ReadOnlySpan
ה־plugin יחבר את ערכי ה־byte-ים לסכום ulong עם מדיניות overflow מפורשת. הוא לא ישמור תצוגה של קלט אחרי החזרה מן הפעולה, וידחה שימוש אחרי Dispose. המארח ישאיל מערך אחד מן ה־pool, יקרא קובץ במקטעים מוגבלים ויחזיר את המערך בדיוק פעם אחת גם אם רכיב נכשל. ה־Dispose של הרכיב יתבצע לפני Unload.
הוסיפו מצב בדיקה ששומר בטעות reference לרכיב בתוך root סטטי של המארח. הבדיקה תראה שפריקה אינה מושלמת בזמן שה־root נשאר, תנקה אותו ותבצע בדיקה חוזרת מחוץ לפונקציה שהחזיקה את הרכיב. אל תכניסו איסוף כפוי למסלול הרגיל של עיבוד כל מקטע; הוא שייך רק למעבדת הפריקה.
הגישו גם בדיקות לקובץ ריק, גבול של 64 KiB, קובץ גדול ממספר מקטעים, כשל טעינה, גרסת חוזה לא תואמת וחריגה באמצע Accumulate. נדרש להציג פעם אחת root קונקרטי ב־dump במצב הדליפה, ולמדוד allocated bytes עבור עיבוד אותו קלט אחרי חימום. האימות צריך להשוות תוצאות למימוש scalar עצמאי ולא רק לפלט צפוי שה־plugin עצמו ייצר.
מדד ההצלחה הוא תוצאה נכונה בכל חלוקת מקטעים, אפס השאלות pool שנותרו אחרי כל מסלול, דחייה ברורה של שימוש אחרי סגירה, והסבר מוכח של פריקה שנכשלה והצליחה. תקינות מקבלת 20%, בעלות וחיי משאבים 25%, התאוששות מכשלים 15%, הבנת מנוע הריצה והמערכת 15%, מדידה 10%, שחזור ותיעוד 10% והרחבה עצמאית 5%. מעבר דורש 80 נקודות וללא שימוש ב־buffer אחרי החזרתו או טענה ש־AssemblyLoadContext הוא sandbox.