Find your dll's Part 2
בפוסט הקודם כתבתי על הדרכים שלנו לייבא את ה reference על ידי שימוש ב config file עם Probing, Code base, או על ידי שימוש ב gac.
רונן עקרי הראה לי שיש דרך הרבה יותר חזקה מסתם שימוש ב Config file,
שימוש ב Probing מביא אותנו לכמה בעיות, כל שינוי בגרסה של ה dll יאלץ אותנו לזכור לשנות גם ב Config, אנחנו חייבים לכתוב נתיב אבסולוטי לקובץ,
והבעייה הכי גדולה שנתקלתי, שבזמן פיתוח (debug), הקוד ב Config, צריך להיות בהערה, כי אחרת הוא טוען את ה dll's כמו שכתוב ב Config ולא טוען אותם מתוך ה sln,
(אצלנו פתרנו שהקוד היה בהערה וה installer הוריד את ההערה)
בכל מקרה, אפשר לעשות את זה גם מקוד, שזה נותן לנו שליטה מוחלטת איך לטעון את ה dll, הדבר היחיד שצריך לעשות זה להירשם ל event של AssemblyResolve, כשנרשם לזה, במדה והטעינה של ה dll תכשל, (כי הוא לא יהיה קיים בתיקייה) נגיע ל event ונוכל לטעון לבד את ה dll.
1 static void Main(string[] args)
2 {
3 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
4
5 UseDll();
6 }
7
8 private static void UseDll()
9 {
10 MyClass myclass = new MyClass();
11 }
12
13 static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
14 {
15 Console.WriteLine(args.Name);
16 return Assembly.LoadFile("Path");
17 }
בדוגמא, אנחנו נרשמים ל event, ומפעילים את הפונקציה שמנסה לייצר class מ dll אחר, (מי שינסה להעתיק את הקוד ולבדוק לבד צריך לזכור שאחרי הקומפילציה של ה test project, למחוק את ה dll מה bin)
במדה והטעינה נכשלת אנחנו נגיע למתודה, מה שנחמד בזה, שאפשר לעשות כל דבר, אפשר לייבא את ה dll מהרשת, אפשר לייצר את ה dll בזמן ריצה, כל עוד שנחזיר את ה dll זה יעבוד.
הדבר היחיד שצריך לזכור, שבפונקציה שנרשמים ל event אסור לגשת לקוד שנמצא ב dll שהטעינה שלו יכולה להיכשל,
נניח שאת שורה 10 הייתי רושם בתוך פונקציית ה main, זה היה נכשל, כי ה clr מנסה לקמפל את פונקציית ה main, והוא לא היה מצליח,
ולכן צריך לזכור להרשם ל event בפונקציה נפרדת.