05-10-12, 10:03 PM
.Net Assemblies
في النهاية ومهما كانت لغة البرمجة وال Compiler الذي تستخدمه لبناء تطبيقات .net ، فإن الكود يتحول في النهاية ل intermediate language وهو ما يعرف اختصاراً IL بالاضافة إلى بعض ال metadata ، ويتم وضعه في ملف اسمبلي قابل للعمل مباشرة سواء على شكل exe أو على شكل dll .
سابقاً كان يرمز لل IL باسم MSIL وال MS اختصار لمايكروسوفت ، اما الآن فتمت اضافة اللاحقة C كاختصار ل Common بدلاً من MS السابقة .
يمثل ال IL أو ال MSIL المهام التي يقوم بها البرنامج والأكواد وما شابه ، اما ال metadata فتحتوي على وصف لجميع الأنواع والفئات التي استخدمتها في برنامجك ، ملف الاسمبلي نفسه الذي يضم ال IL وال metadata يتم وصفه ب metadata أيضاً ، يتم اضافة manifest ايضاً لهذه المجموعة ، هناك حالات تجد برنامجك فيها مرتبطاً باكثر من ملف اسمبلي ، وفي هذه الحالة لن يكون لديك سوى manifest واحد فقط في واحد منها يقوم بعمل البداية وربط الملفات مع بعضها البعض .
ال CIL :
لنفترض هذا البرنامج بلغة C# - من كتاب Pro.CSharp 2008
لو قمت بفتحه الاسمبلي الناتج عن هذا الكود ستجد الكود التالي :
يمكن ان يكون لنا في فترة قادمة من هذه الدورة فرصة لتعلم كيفية كتابة الكود CIL ، ولكن لنتركها مبدئياً حسب ظروف الدورة .
حتى هذه المرحلة ، لم يتم تحويل الكود إلى Platform-Specific Instructions ، يتم ذلك في المرحلة التالية من خلال ما يعرف باسم Jitter والذي يقوم بترجمة الكود الناتج إلى كود مناسب لامكانيات الجهاز ونظام التشغيل الذي يعمل عليه البرنامج .
ال MetaData :
مثال على MetaData :
يقوم الكود السابق بوصف الكود السابق ، يمكنك وانت تعمل على .net ان تقوم بالاطلاع على هذا الكود ، اغلب النقاط واضحة وتشرح نفسها ، اعتقد انه ربما لن تحتاج يوماً للتعديل اليدوي على هذا الملف .
ال Manifest :
نسخة واحدة لكل برنامج حتى لو كان هناك اكثر من Assembly File ، يصف هذا الملف الاسمبلي نفسه من حيث رقم نسخة الاسمبلي وملف الاسمبلي الرئيسي في حالة وجود اكثر من ملف ، هذا مثال على كود من هذه النوعية :
والله الموفق ..
والسلام عليكم ورحمة الله وبركاته .
في النهاية ومهما كانت لغة البرمجة وال Compiler الذي تستخدمه لبناء تطبيقات .net ، فإن الكود يتحول في النهاية ل intermediate language وهو ما يعرف اختصاراً IL بالاضافة إلى بعض ال metadata ، ويتم وضعه في ملف اسمبلي قابل للعمل مباشرة سواء على شكل exe أو على شكل dll .
سابقاً كان يرمز لل IL باسم MSIL وال MS اختصار لمايكروسوفت ، اما الآن فتمت اضافة اللاحقة C كاختصار ل Common بدلاً من MS السابقة .
يمثل ال IL أو ال MSIL المهام التي يقوم بها البرنامج والأكواد وما شابه ، اما ال metadata فتحتوي على وصف لجميع الأنواع والفئات التي استخدمتها في برنامجك ، ملف الاسمبلي نفسه الذي يضم ال IL وال metadata يتم وصفه ب metadata أيضاً ، يتم اضافة manifest ايضاً لهذه المجموعة ، هناك حالات تجد برنامجك فيها مرتبطاً باكثر من ملف اسمبلي ، وفي هذه الحالة لن يكون لديك سوى manifest واحد فقط في واحد منها يقوم بعمل البداية وربط الملفات مع بعضها البعض .
ال CIL :
لنفترض هذا البرنامج بلغة C# - من كتاب Pro.CSharp 2008
كود :
// Calc.cs using System; namespace CalculatorExample { // This class contains the app's entry point. class Program { static void Main() { Calc c = new Calc(); int ans = c.Add(10, 84); Console.WriteLine("10 + 84 is {0}.", ans); // Wait for user to press the Enter key before shutting down. Console.ReadLine(); } } // The C# calculator. class Calc { public int Add(int x, int y) { return x + y; } } }كود :
.method public hidebysig instance int32 Add(int32 x, int32 y) cil managed { // Code size 9 (0x9) .maxstack 2 .locals init (int32 V_0) IL_0000: nop IL_0001: ldarg.1 IL_0002: ldarg.2 IL_0003: add IL_0004: stloc.0 CHAPTER 1 n THE PHILOSOPHY OF .NET 13 IL_0005: br.s IL_0007 IL_0007: ldloc.0 IL_0008: ret
} // end of method Calc::Addيمكن ان يكون لنا في فترة قادمة من هذه الدورة فرصة لتعلم كيفية كتابة الكود CIL ، ولكن لنتركها مبدئياً حسب ظروف الدورة .
حتى هذه المرحلة ، لم يتم تحويل الكود إلى Platform-Specific Instructions ، يتم ذلك في المرحلة التالية من خلال ما يعرف باسم Jitter والذي يقوم بترجمة الكود الناتج إلى كود مناسب لامكانيات الجهاز ونظام التشغيل الذي يعمل عليه البرنامج .
ال MetaData :
مثال على MetaData :
كود :
TypeDef #2 (02000003)
------------------------------------------------------- TypDefName: CalculatorExample.Calc (02000003) Flags : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit] (00100001) Extends : 01000001 [TypeRef] System.Object Method #1 (06000003) ------------------------------------------------------- MethodName: Add (06000003) Flags : [Public] [HideBySig] [ReuseSlot] (00000086) RVA : 0x00002090 ImplFlags : [IL] [Managed] (00000000) CallCnvntn: [DEFAULT] hasThis
ReturnType: I42 Arguments
Argument #1: I4
Argument #2: I42 Parameters
(1) ParamToken : (08000001) Name : x flags: [none] (00000000)
(2) ParamToken : (08000002) Name : y flags: [none] (00000000)يقوم الكود السابق بوصف الكود السابق ، يمكنك وانت تعمل على .net ان تقوم بالاطلاع على هذا الكود ، اغلب النقاط واضحة وتشرح نفسها ، اعتقد انه ربما لن تحتاج يوماً للتعديل اليدوي على هذا الملف .
ال Manifest :
نسخة واحدة لكل برنامج حتى لو كان هناك اكثر من Assembly File ، يصف هذا الملف الاسمبلي نفسه من حيث رقم نسخة الاسمبلي وملف الاسمبلي الرئيسي في حالة وجود اكثر من ملف ، هذا مثال على كود من هذه النوعية :
كود :
.assembly extern mscorlib
{ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .ver 2:0:0:0 } .assembly Calc { .hash algorithm 0x00008004 .ver 0:0:0:0 } .module Calc.exe .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 512
.corflags 0x00000001والله الموفق ..
والسلام عليكم ورحمة الله وبركاته .
