GAC + Add Reference

בטיטi

New member
GAC + Add Reference

לאחר שאני חותם אסמבלי, ומכניס אותו ל GAC, אני יוצר פרוייקט חדש, שרוצה להשתמש בפונקציואליות של האסמבלי שב GAC : 1. כיצד מבצעים אליו add reference ? 2. ב GAC יהיו מספר גירסאות של האסבמלי, האם בביצוע ה add reference צריך לציין גירסא ספציפית ?
 
Nil ref error

תסתכל בעמודות של הרפרנס, אתה תראה שם את הגרסה של ה DLL שב GAC. באופן כללי אני לא ממליץ לשים דברים ב GAC. זה הופך פרישה במחשב אחר ליותר קשה, וזה יכול להכניס אותך לצרות עקב בחירת גרסה מה GAC לעומת גרסה מקומית, כו'. ה GAC נותן פתרון לארגונים גדולים עם הרבה מאוד פונקציונליות משותפת, לא לרוב הפרויקטים.
 

Justin Angel

New member
../images/Emo26.gif

לדעתי הכנה, ה-GAC מתאים לכל אפליקציה לא משנה סדר הגודל שלה. הבעיות שה-GAC פותר הן לא בעיות של "ניהול אנשים" אלא בעיות של "ניהול תוכנה" וספציפית ניהול גירסאות. דווקא, הפרוייקט שאתה עובד עליו (Castle) הוא דוגמה מושלמת למתי צריך להשתמש ב-GAC היות ובערך כל יומיים יש DLL בגירסה חדשה. בנוגע לפריסה ל-GAC במהלך התקנה, בשביל זה קיים קונספט ה-Merge module. הרעיון הוא שאם יש לך רכיב תוכנה שצריך אותו במספר התקנות תיצור לו Merge module. לרשימת Merge modules שכרגע יש לך על המחשב באדיבות מיקרוסופט שווה להציץ ל:
C:\Program Files\Common Files\Merge Modules​
ניתן ליצור Merge module לכל DLL שרוצים לפרוס ל-GAC ואז לאחד את ה-Merge module לתוך הפרוייקט התקנה הגדול של האפליקציה. ככה גם פרוייקט (כמו Castle) שמטרתו היא להפיץ את ה-DLLים שלו יאפשר פיתוח מהיר של אפליקציות התקנות היות וכל מה שעושים זה להוסיף את ה-Merge modules לפרוייקט התקנה. ניתן ליצור בנייה על בנייה של אסמבלי Merge module מתוך MSBuild וככה באמת מדובר בשלוש שניות עבודה.
 
Nil ref error

עצם זה של castle יש גרסה כל יומיים (ואצלי מספר פעמים ביום) הוא הסיבה שאני לא רוצה להכניס אותו ל GAC. אני רוצה שתהליך העדכון של גרסה יהיה פשוט החלפה של DLL, לא הטענה ל GAC - בניית קובץ מכווין מחדש, וכו'. ניהול גרסאות נעשה בצורה לוקאלית לכל פרויקט שמשתמש בהם. במידה ואני רוצה לעדכן גרסה, אני פשוט מחליף DLL בתיקייה של הפרויקט, וזהו. לרשום גרסה נוספת, שאני אחליף יום / שעה אחר כך, לא בדיוק הולך. וכן, אני מגיע למצב שבו אני צריך להוסיף תכונה, בודק באפליקציה, ואז צריך לתקן איזה באג / עוד אפשרות, וכו' - יכול להגיע למספר רב של פעמים ביום.
 

Justin Angel

New member
קה פרובלמה מואי צ'יקיה?

אבל בדיוק ככה מגיעים למצב שיש בעיות Versioning ו-DLL Hell. כי אז לשום DLL אין שום מספר גירסה ועם אלף גירסאות לך תמצא את הגירסה שצריך כרגע. את Castle אפשר לפתור בשימוש נכון במספרי גירסה. תגדירו את הגירסה הנוכחית כשל כל DLL כגירסה 1.0.0.0. כל עוד לא מבצעים שינוי שובר כלשהו אפשר להשאיר את מספר הגירסה קבוע על 1.0.0.0 ואז כל פריסה מחודשת של ה-DLL ל-GAC תגרום לעדכון גורף של כל האפליקציות על המחשב המשתמשות ב-DLL. ככה למשל תוכלו להקל על הפצה של תיקוני באגים כי אין צורך לקמפל מחדש את התוכנה. בפעם הבאה שיש שינוי שובר באיזהשהו DLL תשנו את המספר גירסה (לעלות את המספר הראשון מ-1 ל-2 אם זה שינוי ענק או את המספר השני מ-0 ל-1 עם זה שינוי קטן) ואז לדאוג לשנות את ההפניות של ה-DLL מגירסה 1.0.0.0 לגירסה 1.1.0.0 למשל. ואם אתה חושש מזה שזה יקשה על הפיתוח של מפתחי הספרייה שיצטרכו לעדכן אלפי הפניות או משהו, פשוט תפרוס ל-GAC (או לפרוייקטים הרלוונטים) במחשבי הפיתוח קובץ config עם policy שאומר "במקום לגשת לגירסה 1.0.0.0 תיגש אוטומטית ל-1.1.0.0" ורק לפני פריסה תדאגו לעדכן את ההפניות להפניות הרלוונטיות. לי יש אפילו שיר נושא
http://www.interfacett.com/dllhell
 
Nil ref error

לדעתי, אנחנו מדברים על שני דברים שונים כאן. ל castle יש מערכת גרסאות אוטומטית שמתעדכנת מ SVN. ככה שאני תמיד יודע איזה גרסה אני, ומול איזה גרסת קוד אני עובד. זה לא עניין של ניהול גרסאות, זה עניין של _לא_ לנהל גרסאות. לכל פרויקט יש את גרסה אישית שלו של הספריות בהם הוא משתמש. במידה וצריך, אני יכול להתאים בין גרסת ה DLL לקוד של הספריה בזמן שה DLL נוצר, אבל לרוב זה לא נדרש. אף פרויקט לא מתערב בגרסה של פרויקט אחר, אני יכול לרוץ עם גרסאות שונות בכל אחד ללא בעיות. בדרך כלל כל פעם שאני נוגע בפרויקט אני דואג לעדכן אותו לגרסאות האחרונות של המוצר. castle באופן ספציפי מאוד דואגת לשמור על תאימות לאחור, ושינויים דרטיים בדר"כ מלווים בהסבר + תיעוד - ככה שזה לא בעיה. השינוי היחיד כאן הוא במידה ויש תיקון באג לשרת שעליו רצות כמה אפליקציות, שמה אני באמת אוכל להתחיל לשחק עם דברים ולעדכן את כל האפליקציות שרצות על השרת במקביל. אני עדיין חושב שבמקרים כאלו, אני עדיין ארצה לבדוק כל אפליקציה בנפרד על מנת לראות אם העדכון שבר אותה או לא, אבל זה בהחלט יתרון של לשים ב GAC. היתרון מבחינתי בלא לשים ב GAC שעדכון גרסה הינו פשוט החלפת DLL, מסונכרן מול SVN ככה שפעם הבאה שכל חבר צוות מתעדכן מול השרת, הוא מקבל את הגרסה החדשה, ללא כל צורך בעבודה מצדו.
 

Justin Angel

New member
קה פרובלמה מואי צ'יקיטה?

לאחר הוספת אסמבלי ל-GAC היא מופיעה אוטומטית ברשימת האסמבליס בתוך Add Reference. "בעיה" נפוצה ב-Visual studio (על כל גירסאותיו) היא שבפעם הראשונה שבו נטען מסך Add reference לוקח עד שלושים שניות (בצורה סינכרונית ככה ש-Visual studio לכאורה נתקע). זה בגלל שהוא מבצע חיפוש ברשימת תיקיות במחשב שמוגדרות כבעלות אסמבליס וב-GAC.
 

בטיטi

New member
תודה, אל כיצד אני מקשר ל..

גירסא ספציפית ? כלומר, אם ב GAC יש מספר גרסאות של האסמבלי, האם רק הגירסה האחרונה תוצג ?
 
למעלה