CLR

ForumMember

New member
CLR

שלום, אני מעונין לקבל הסבר על CLR. הבנתי מהמאמר שבפורום שהקוד ב net מתקמפל ל Intermediate Language, אז איפה מוצאים את הקבצים המקומפלים? האם כל שמירה והרצה של הקוד משמעה גם קימפול של הקוד? ומה זה אומר כמעט שפת מכונה? האם הסיבה שלא מבוצע קימפול מלא היא הרצון להמנע מתלות בפלטפורמה? תודה
 

yuval k

New member
CLR

הקבצים המקומפלים נמצאים ב-GAC: Global Assembly Cache, שזו בעצם תיקיית מערכת. אצלי זה תחת ההיררכיה של C:\Windows\Assembly - אפשר לראות ממש איך זה מורכב בשיטוט ב-Command Prompt. אולם אין משמעות רבה לקבצים הנ"ל, עבור המפתח לסביבת הדוט-נט, למשל. כן, כל הרצה של הקוד משמעה קימפול הקוד, אלא אם התבצע קימפול מראש והכנסה ל-GAC, באופן ידני (ראה קישור). כמעט שפת מכונה, היא כפי שנשמע: שפה בסיסית, אבל ברמה עילית יותר משפת מכונה. וכן, הסיבה שהקימפול אינו מלא היא כדי שיהיה אפשר לפתח CLR לפלטפורמות שונות ולהימנע מתלות
 

gilad g

New member
יובל...

זה לא ממש נכון..
קודם כל, GAC לא מקמפל את האפליקציות -- את זה עושה ngen.exe. עכשיו, ngen אמנם שם את האסמבליז שנהוא קימפל לתוך C:\windows\assembly, אבל לא לתוך ה-GAC (יש שם ספרייה ששמה NativeAssemblies). התפקיד של ה-GAC, הוא שיתוף של assemblies בין תוכנית לתוכנית (כמו System.Data.dll). זה בעצם מקום שבו ה-CLR יחפש assemblies, אם יש לתוכנה מסוימת רפרנס ל-assembly מסוים שלא נמצא באותה ספריה שלו.
 

yuval k

New member
לא אמרתי שה-GAC מקמפל אותן...

בהחלט לא
וכן, זה נכון בעניין ה-NativeImages וה-GAC... אני צריך בפעם הבאה לקרוא יותר לעומק
 

nattygur

New member
תשובה

הקבצים המקומפלים נמצאים במקום אשר בהם הוגר לסביבת הפיתוח לייצר אותם. בדרך כלל זה תחת ספרית bin/Debug. את הקבצים ניתן לקרוא בעזרת תכנית בשם ildasm המגיעה עם ערכת הפיתוח. במידה ורוצים לשתף assembly בין מספר אפליקציות ניתן לרשום ולשמור את ה Assembly ב GAC בעזרת Gacutil. השימוש ב ngen נועד להפוך את קוד ה IL לשפת מכונה והוא אכן שומר קובץ זמני של ה Assembly המקומפל עד חשינוי ב Assembly. בכל מקרה ה ngen לא מתאים לכל סוגי הפרוייקטים בשל תצורת ה Assembly (הסבר אחר שקשור ב neutral assemblies). לדוגמה ngen על פרוייקט asp.net אין בו שום טעם. הקימפול ל IL אכן נועד למנוע תלות בסביבות פיתוח ואכן כבר כיום ישנם CLRs עבור FressBds ו Linux. אם ברצונך להכיר ולהבין את IL ישנו ספר של מייקרוסופט אשר מסביר את פקודות ה IL. דרך אגב יש דברים שניתן לעשות רק דרך IL ולא דרך שפות הפיתוח. מקווה שעזר נתי גור [MVP]
 

yuval k

New member
../images/Emo45.gif

אבל חשבתי שהוא התכוון ל"קבצים המקומפלים" שיוצר ה-JIT Compiler...
 
אם כבר מדברים על זה...

האם יש אפשרות, כן לקמפל את הקוד לשפת מכונה, או לפחות להצפין איכשהו את הקוד, כך שלא יוכלו לראות את הקוד של התוכנה שאני מפתח. אני רוצה להפיץ את התוכנה ללקוחות ולא רוצה שהם יוכלו לראות את הקוד שלי ולשנות דברים בתוכנה
 

nattygur

New member
כן אפשר. לא לשפת מכונה אבל

יש דרכים אחרות 1) מניעת שימוש ב ILDASM ע"י שיוך לבעלים (פתרון מייקרוסופטי) http://www.c -sharpcorner.com/Security/ProtectILCode.asp 2) כלי מסחרי - http://www.remotesoft.com/salamander/protector.html.
 

סוכו

New member
תודה!

על הפתרון השני שמעתי, אבל הוא עולה כסף.... אבל על הפתרון הראשון לא שמעתי והוא נשמע טוב (עד שיפרצו אותו האנשים הרעים.... :) ) רוני.
 

gilad g

New member
אתה יכול להסביר למה

אין טעם להשתמש ב-ngen עם asp.net
 

nattygur

New member
כן,

בקיצור Assemblies יכולים להטען ע"י ה CLR בשני צורות Domain neutral או Non domain neutral. הבעיה היא ש Ngen מייצר קוד מתוך הנחה שה Assembly היחיד אשר נטען באופן ניטראלי הוא mscorelib.dll. אם מסיבה כל שהיא ה CLR מזהה assemblies אחרים שנטענו באופן ניטראלי הוא לא יכול להשתמש בקוד שהופק ע"י nGen וחוזר להשתמש ב JIT. באפליקציות ASP.NET טעינת strongly named Assemblies מתבצעת באופו ניאטראלי. נתי גור [MVP]
 
למעלה