פתרון שורשים שמונעים פריקה¶
השינוי המרכזי הוא החזקת delegate שה־Method שלו שייך ל־plugin. קטע הקוד הבא מחליף את השורה שמפעילה method בתוך Execute; שאר מבנה הניסוי נשאר כפי שהיה בהרצאה.
הוסיפו ל־Host את הטיפוס הבא, ונקו את השדה בין שתי לולאות הבדיקה. מומלץ לבצע את הניקוי בפונקציה נפרדת שאינה inline כדי להימנע מ־local של בדיקה ששומר בטעות עותק של ה־delegate.
בפתרון החוזה המשותף נאתר את typeof(IPlugin).Assembly ונשווה את AssemblyName של הבקשה לשם החוזה שלנו. במקרה של שם מתאים אבל גרסה לא נתמכת נזרוק FileLoadException, ובמקרה של התאמה נחזיר את אותו assembly. אין צורך לטעון אותו שוב מן הנתיב של ה־plugin. שאר התלויות יכולות להיפתר דרך AssemblyDependencyResolver לפי המדיניות שהגדרנו.
הכשל הראשוני נוצר מפני שה־plugin מיישם את הממשק מן העותק הפרטי, בעוד ה־cast מבקש את הממשק מן העותק המשותף. לאחר התיקון שניהם משתמשים באותו טיפוס. ההקשר עדיין אינו יכול להיפרק כל עוד Roots.Callback חי; תיקון הזהות אינו תיקון lifetime. בתחקיר נשתמש ב־dump וב־gcroot כדי למצוא מסלול אחיזה קונקרטי במקום להוסיף עוד קריאות GC.Collect בלי להבין מה הן אמורות לשנות.