PE Header / CLR Header / MetaData

Artic

New member
PE Header / CLR Header / MetaData

הבנתי שלכל קובץ המכיל קוד דוט נטי, יש את 2 המאפיינים הנ"ל, מישהו יכול להסביר בבקשה מה זה בכלל ? (נתונים שכתובים בתחילת הקובץ ?) מה כל אחד מכיל וכו' ?
 

Artic

New member
שאלה נוספת : רץ...

כשאני כותב אפליקציה חלונאית או קונסולית (למשל) (קובץ EXE), ואני מריץ אותה במחשב אחר, ונניח שה Framework מותקן על המחשב השני (אחרת התוכנית שלי לא תרוץ) - היכן נכנס לתמונה ה CLR ? הרי ידוע שה CLR הוא זה שאמור להריץ את ה EXE, אבל כשאני רוצה להריץ, אני פשוט מקליק פעמיים והתוכנית רצה. האם ה CLR מופעל ? מי מפעיל אותו ? כיצד ?
 

Artic

New member
../images/Emo31.gif לא הבנת כלום...

ברור שה CLR מריץ, השאלה שלי היא כזו : נניח ובמחשת לא רץ של רכיב ושום CLR. כעת אני מקליק פעמיים על קובץ EXE _תוכנה קטנה שנכתבה ב #C - דוט נט). מה שקורה בפועל הוא שה CLR עולה, מקמפל את ה MSIL לקוד מכונה, ומריץ אותו. אבל מי בכלל קרא ל CLR ?!? איך הוא ידע לעלות ?
 

gilad g

New member
ה-EXE שלך ../images/Emo13.gif

יש לו dependency ל-mscoree.dll, שמפעיל את ה-CLR.
 

Artic

New member
חוששני שגם זה לא מדוייק...

לפי מה שקראתי בספרות, ברגע שה EXE נבנה, מוחדר אליו קוד בתחילת סגמנט ה .text שמריץ את ה CLR (ה DLL שציינת...)
 

gilad g

New member
לזה בדיוק התכוונתי.

ב-mscoree.dll יש פונקציה ששמה _CorExeMain, שמפעילה את ה-CLR.
 

Artic

New member
המממממ.........

OK, כנראה שאני האהבל
אתה יכול לכתוב עוד מספר מילים על ה CorExeMain ? מי מפעיל את מי וכיצד ?
 

orenphp

New member
המשך קצר לתשובה.

ראיתי את זה באיזה מקום ושמרתי לי בצד. אולי זה יעניין אותכם גם:
CIL (.NET) executables use the "standard" PE (Portable Executable) format that the rest of Windows uses. To ensure that you can start a CIL program "normally" (for Windows users), a trick is played. The .EXE has an dependency on another library (not a managed assembly, but a normal Windows DLL installed in %WINDIR%\system32), and sets the program entry-point into a function exported by this DLL (CorExeMain, or something). The end result is that (again, on Windows) the OS loads the EXE, loads all dependent libraries, which (indirectly) loads the .NET runtime, and the .NET runtime takes over the process and starts JITing/executing the CIL code. In essence, the "portable" .EXE/.DLL format has some native X86 code to ensure it works "right" on Windows. Other platforms can (and do!) easily ignore it.​
תהנו.
 

gilad g

New member
אז ככה -

PE Header - זהו header כללי שיש לכל קובץ בינארי של windows, בלי קשר לדוט נט. הוא מכיל מאפיינים כמו מבנה הקובץ, תלויות בקבצים אחרים, וכו'. CLR Header / Metadata - זהו header שיש רק ל-assemblies של דוט נט. הוא מגדיר אילו מחלקות יש בקובץ, באיזה namespaces, מהן המתודות/שדות שלהן, וכו' וכו'. אפשר להשתמש בתוכנה קטנה ושימושית ששמה ILDASM כדי לבחון את ה-header הזה. ILDASM מגיעה עם ה-SDK.
 

Artic

New member
תודה אבל...

CLR HEADER ו Metadata אלו 2 דברים שונים (לפחות בספרות) יודע מה ההבדל בינהם ?
 

orenphp

New member
תשובה חלקית.

METADATA - תיאור של הקוד, או כמו שהאוהבים להגיד data on data. בחלק זה של האסמבלי, תוכל למצוא מידע על מבנה האסמבלי, אילו מחלקות/מתודות/מאפיינים/הפניות וכו' יש בו - כוח אדיר בשביל שימוש בReflection. CLR HEADER - נכלל כחלק מהPE HEADER. בכל קובץ יש PE HEADER שבעצם נותן מידע לגבי אופן הרצת הקובץ על המחשב. באסבמלי הdotnet-י, ניתן מידע לגבי אופן הרצת הקובץ באמצעות הCLR.
 

Artic

New member
../images/Emo35.gif מה ההבדל בין CTS ל CLS ?

אני יודע בגדול שה CLS הוא אוסף הדברים הבסיסים שצריכים להיות בכל שפה דוטנטית, ו CTS מגדרים דברים ברמה היותא עקרונית (אובייקטים התנהגות וכו'). אם מישהו יכול להגדיר זאת בצורה טובה יותר, ואפילו לתת דוגמא את שתיים לדברים שי ב CTS וב CLS - זה יבהיר לי את התמונה בצורה טובה הרבה יותר. Thnaks !
 

yuval k

New member
CTS מגדיר התנהגות של סוגי נתונים

(Common Type System). ה-CLS מגדיר אלו דברים שפה צריכה לממש כדי שתוכל להיות דוט-נטית, כך שנדמה לי שה-CTS הוא חלק מה-CLS...
 

Artic

New member
../images/Emo35.gifמה ההבדל בין Primitive ל Value ?

אני יודע ש Reference Type זהו סוג משתנה שמוקצה המערימה המנוהלת (Managed Heap) - כלומרר אובייקטים. כמו כן אני יודע ש Value Types אלו סוגי משתנים שמוקצים מהמחסנית (Stack) כמו למשל int (שווה ערך ל System.Int32). 1. האם נכון יהיה לומר שאובייקטים הם תמיד Reference Types, וש Reference Type הוא תמיד אובייקט ? (כלומר, נכו ןלשתי הכיוונים) 2. האם נכון יהיה לומר ש Value Type תמיד מוקצה מהערימה, וגם שכל המשתנים שמוקצים מהערימה הם Value Types ? (כלומר, נכון לשתי הכיוונים) 3. האם Primitive Type = Value Type ? 4. למשל :
Object o = new Object;​
האובייקט עצמו מוקצה מהערימה, ואילו ההצבעה (o) מוקצית מהמחסנית, האם נכון יהיה לומר שהאובייקט o הוא מסוג reference type ואילו המשתנה הוא מסוג value type ?
 
למעלה