ABA


"#C - איך לעשות unload לDLL כדי שאוכל למחוק אותו נגיד?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11179 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11179
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   17:55   13.02.13   
אל הפורום  
  #C - איך לעשות unload לDLL כדי שאוכל למחוק אותו נגיד?  
 
   יש לי אפליקציה, שעושה שימוש בDLL כלשהו (שלי).
אני רוצה (בזמן ריצה) לעשות לDLL הזה UNLOAD על מנת שהוא לא יהיה תפוס (על ידי) ואוכל למחוק אותו.

ב++C אני יכול לטעון אותו דינמי ואז לשחרר אותו ואין בעיה.
ב#C אני לא מצליח לשחרר אותו!
ניסיתי לטעון אותו עם AppDomain.Load ואחרי זה אני עושה AppDomain.Unload וזה אכן הורס את האובייקט שלי, אבל זה לא משחרר את הDLL.

תודה


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  זה עוזר? inno3D 13.02.13 18:07 1
     לא :) כמובן שעברתי על התוצאות האיכותיות של גוגל... GaBrIeL 13.02.13 18:14 2
         הפתרון שלך הוא הפתרון הנכון, יוחאי 13.02.13 18:53 3
             כמו שאמרתי - לא מרוצה מהשיטה הזו, היא לא נקיה :) וליתר דיוק GaBrIeL 13.02.13 19:42 4
                 תסביר קצת מה לא נקי בה, אולי יהיה אפשר לעזור לך יותר, אתה גם יכול נורא בקלות יוחאי 13.02.13 21:40 5
                     זה לא עוזר לי GaBrIeL 13.02.13 21:57 6
                         יש לי איזה רעיון אולי זה יעבוד, יוחאי 13.02.13 22:30 7
                             לא נראה לי בדיוק מתאים למה שאני צריך, GaBrIeL 14.02.13 08:49 9
             פתרתי :) GaBrIeL 14.02.13 08:47 8
                 נו ומה אנחנו עשן? תפרסם את הפתרון. יוחאי 14.02.13 10:16 10
                     אה חחח לא לא פתרתי את הבעיה המקורית - פתרתי משהו קטן שנתקלתי בו GaBrIeL 14.02.13 10:51 11
                         CODE GaBrIeL 14.02.13 10:51 12

       
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   18:07   13.02.13   
אל הפורום  
  1. זה עוזר?  
בתגובה להודעה מספר 0
 
   http://stackoverflow.com/questions/1371877/how-to-unload-the-dll-using-c


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   18:14   13.02.13   
אל הפורום  
  2. לא :) כמובן שעברתי על התוצאות האיכותיות של גוגל...  
בתגובה להודעה מספר 1
 
   הפתרונות שלהם זה הדוגמא שנתתי - אומנם עושה Unload אבל הקובץ עצמו לא משתחרר.

הצלחתי בצורה אחרת (מכוערת) להשיג את מבוקשי, אבל אני לא מרוצה ממנה בכלל.
בגדול אני קורא את הDLL לbyte array בזיכרון (כך אני לא תופס את הקובץ מלכתחילה) ואז טוען אותו כAssembly ויוצר instance. לא כזה נקי...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   18:53   13.02.13   
אל הפורום  
  3. הפתרון שלך הוא הפתרון הנכון,  
בתגובה להודעה מספר 2
 
   קורא את קובץ הDLL (דרך File Class)
כותב אותו לMemoryStream
משתמש בAssembly.Load כדי לטעון אותו
משתמש רץ על GetExportedTypes דרך האובייקט שחזר לך מ-Assembly.Load
משתמש בActivator.CreateInstance כדי לייצר מופע של הDLL שלך
משחרר את הקובץ כשסיימת.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   19:42   13.02.13   
אל הפורום  
  4. כמו שאמרתי - לא מרוצה מהשיטה הזו, היא לא נקיה :) וליתר דיוק  
בתגובה להודעה מספר 3
 
   הקובץ שלי משוחרר כבר ברגע שסיימתי לקרוא אותו לstream


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   21:40   13.02.13   
אל הפורום  
  5. תסביר קצת מה לא נקי בה, אולי יהיה אפשר לעזור לך יותר, אתה גם יכול נורא בקלות  
בתגובה להודעה מספר 4
 
   להוסיף את הDLL שלך כ-reference ולהשתמש בו בפרוייקט.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   21:57   13.02.13   
אל הפורום  
  6. זה לא עוזר לי  
בתגובה להודעה מספר 5
 
   אני רוצה בזמן ריצה - "להתנתק" מהDLL, אחרי שכן עשיתי בו שימוש.

לא נקי כי זה מרגיש לי דרך עקיפה ולא יפה לטעון DLL.
למה לעזאזל Unload לא משחרר את הקובץ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   22:30   13.02.13   
אל הפורום  
  7. יש לי איזה רעיון אולי זה יעבוד,  
בתגובה להודעה מספר 6
 
   תנסה לבצע את הטעינה שלך עם DoCallback



appDomain.DoCallBack(() => AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(assemblyPath)));



אחר כך תקרא ל AppDomain.Unload(appDomain);

ואחרי זה תנסה למחוק/לעשות לקובץ מה שבא לך.

עוד מידע על DoCallback
http://msdn.microsoft.com/en-us/library/system.appdomain.docallback.aspx


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   08:49   14.02.13   
אל הפורום  
  9. לא נראה לי בדיוק מתאים למה שאני צריך,  
בתגובה להודעה מספר 7
 
   אני לא רוצה לקרוא למתודה אחת וגמרנו, אני רוצה את האובייקט לשימוש. DoCallBack גורם לביצוע של פונקציה אבל הוא לא מחזיר כלום.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   08:47   14.02.13   
אל הפורום  
  8. פתרתי :)  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 14.02.13 בשעה 08:52 בברכה, GaBrIeL
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   10:16   14.02.13   
אל הפורום  
  10. נו ומה אנחנו עשן? תפרסם את הפתרון.  
בתגובה להודעה מספר 8
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   10:51   14.02.13   
אל הפורום  
  11. אה חחח לא לא פתרתי את הבעיה המקורית - פתרתי משהו קטן שנתקלתי בו  
בתגובה להודעה מספר 10
 
   כשניסיתי להמשיך עם השיטה של לקרוא את הקובץ ולטעון אותו כmemory stream.

מסתבר שהtype לא נחשב אותו type אם אתה טוען מassemblies שונים. אפילו שזה אותו קובץ ואותו class כמובן!
ואז קיבלתי invalid cast exception אחרי שעשיתי create instance ורציתי להשתמש בו.

לסיכום זה הקוד שעובד:


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   10:51   14.02.13   
אל הפורום  
  12. CODE  
בתגובה להודעה מספר 11
 
  

AppDomain testDomain = AppDomain.CreateDomain("testDomain");
Assembly testUtils;
using (FileStream fs = File.Open("TestUtility.dll", FileMode.Open,FileAccess.Read,FileShare.Read))
{
using (MemoryStream ms = new MemoryStream())
{
byte buffer = new byte;
int read;
while ((read = fs.Read(buffer, 0, 1024)) > 0) { ms.Write(buffer, 0, read); }
testUtils = testDomain.Load(ms.ToArray());
}
}
if (testUtils == null) throw new Exception("testUtils is null!");

MyClass myClassInstance = testUtils.CreateInstance("TestUtils.MyClass") as MyClass;
// use myClassInstance as you wish! The "TestUtility.dll" that contains its impl is free and can be deleted.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net