DCSIMG
Find your dll's Part 2 - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

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 בפונקציה נפרדת.

פורסם: Dec 10 2008, 08:13 AM by Shlomo | with 1 comment(s)
תגים:,

תוכן התגובה

Rotem Bloom כתב/ה:

היי שלמה אתה יכול להשתמש גם ב-DEVPATH

blogs.microsoft.co.il/.../did-you-know-net-devpath-environment-variable.aspx

# December 10, 2008 9:11 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 3 and 2 and type the answer here:


Enter the numbers above: