17-09-12, 12:54 PM
[ملحوظة: هذا الموضوع يناقش أغراض تعليمية فقط, ولا يمت بصلة بموضوع الهندسة العكسية.]
Reflection من التقنيات الهامة للدوت نت, وعن طريقها يستطيع أي برنامج جمع معلومات التعريف MetaData الخاصة به والتعامل معها, وتعتبر آلية قوية وفعالة للتعامل مع الكائنات وقت التشغيل, أدوات ال Reflection توجد ضمن مساحة الإسم System.Reflection, تتيح الفئات والواجهات الموجودة ضمن مساحة الاسم System.Reflection المبرمجين من مراقبة وجمع المعلومات حول نوع Type معيّن, وكذلك الوصول إلى الخصائص والدوال والإجراءات الخاصة بذلك النوع باستخدام الإجراء Invoke, يمكن من خلالها أيضا كتابة تطبيقات و برامج الهندسة العكسية, مستعرضات للفئات Class Viewers, أو محررات الخصائص Property Editors, سنناقش في هذا الموضوع الاستخدامات التالية لآلية Reflection, وهي:
بعض المفاهيم الأساسية:
System.Type: هذه الفئة أساسية ويمكن ان تمثل عدة أنواع, إما: الفئات, الواجهات المصفوفات, أوالتراقيم (هذه هي الأنواع التي تهمنا).
.NET Managed Module (وحدة نمطية مُدارة): هو إما ملف تنفيذي محمول Portable Executable أو ملف نوع Type DLL, قد تحتوي على فئة واحدة أو واجهة واحدة أو اكثر, يمكن ان تحتوي هذه الوحدة النمطية على اكثر من مساحة اسم NameSpace واحدة, ويمكن أن تشمل مساحة اسم واحدة على أكثر من وحدة نمطية.
واحدة او أكثر من الوحدات النمطية تشكل مجتمعة مايعرف بالـتجميع Assembly, لا يجب الخاط بين Module أو (وحدة التعليمات البرمجية) الخاصة بـ Visual Basic وبين الوحدة النمطية.
يمكن الحصول على وحدة نمطية بعد ترجمة التعليمات البرمجية باستخدام Visual Studio أو باستخدام اداة مترجم اللغة vbc.exe (Visual Basic compiler) او الأداة csc.exe ( CSharp compiler) والموجودة ضمن ادوات سطر الأوامر Visual Studio Command Line tools.
يمكن ربط أكثر من وحدة نمطية واحدة لتشكيل تجميع واحد باستخدام الأداة Al.exe (Assembly Linker), والمخطط التالي يوضح ذلك:
تتشكل كل وحدة نمطية أساساً من الأجزاء التالية:
Application Domain (مجال التطبيق): هو البيئة التي يعمل عليها التطبيق حيث توفر تلك البيئة عزلاً لما يقوم به التطبيق عن باقي التطبيقات, تمكِّن الفئة AppDomain الوصول إلى مجال التطبيق الحالي, وتطبيق جملة من العمليات عليه.
Reflection من التقنيات الهامة للدوت نت, وعن طريقها يستطيع أي برنامج جمع معلومات التعريف MetaData الخاصة به والتعامل معها, وتعتبر آلية قوية وفعالة للتعامل مع الكائنات وقت التشغيل, أدوات ال Reflection توجد ضمن مساحة الإسم System.Reflection, تتيح الفئات والواجهات الموجودة ضمن مساحة الاسم System.Reflection المبرمجين من مراقبة وجمع المعلومات حول نوع Type معيّن, وكذلك الوصول إلى الخصائص والدوال والإجراءات الخاصة بذلك النوع باستخدام الإجراء Invoke, يمكن من خلالها أيضا كتابة تطبيقات و برامج الهندسة العكسية, مستعرضات للفئات Class Viewers, أو محررات الخصائص Property Editors, سنناقش في هذا الموضوع الاستخدامات التالية لآلية Reflection, وهي:
- بعض المفاهيم الأساسية
- كيفية جمع بيانات التعريف MetaData حول تجميع Assembly معيّن , واستكشاف الأنواع التي يحتويها ذلك التجميع
- الاستدعاء الديناميكي للإجراءات والخصائص وقت التشغيل RunTime
باستخدام الربط المتأخر Late binding يمكن إنشاء مثيل كائن Object Instance من نوع معيّن واستدعاء الإجراءات والخصائص الخاصة به, بعد الكشف عنها.
- إنشاء التجميعات والأنواع أثناء وقت التشغيل باستخدام مساحة الاسم System.Reflection.Emit
وهذه هي الميزة الأكثر أهمية وفائدة في تقنية Reflection, حيث تساعد على إنشاء الأنواع والتجميعات أثناء وقت التشغيل من أجل إنجاز مهام معيّنة حسب الحاجة إليها, وحفظها على مساحات التخزين, واستخدامها كذلك أثناء وقت التشغيل, وتعتبر هذه الميزة مدخلاً لما يعرف بالذكاء الصناعي, ومع ذلك فإن لهذه التقنية مساوئ سنناقشها في بقية الموضوع.
بعض المفاهيم الأساسية:
System.Type: هذه الفئة أساسية ويمكن ان تمثل عدة أنواع, إما: الفئات, الواجهات المصفوفات, أوالتراقيم (هذه هي الأنواع التي تهمنا).
.NET Managed Module (وحدة نمطية مُدارة): هو إما ملف تنفيذي محمول Portable Executable أو ملف نوع Type DLL, قد تحتوي على فئة واحدة أو واجهة واحدة أو اكثر, يمكن ان تحتوي هذه الوحدة النمطية على اكثر من مساحة اسم NameSpace واحدة, ويمكن أن تشمل مساحة اسم واحدة على أكثر من وحدة نمطية.
واحدة او أكثر من الوحدات النمطية تشكل مجتمعة مايعرف بالـتجميع Assembly, لا يجب الخاط بين Module أو (وحدة التعليمات البرمجية) الخاصة بـ Visual Basic وبين الوحدة النمطية.
يمكن الحصول على وحدة نمطية بعد ترجمة التعليمات البرمجية باستخدام Visual Studio أو باستخدام اداة مترجم اللغة vbc.exe (Visual Basic compiler) او الأداة csc.exe ( CSharp compiler) والموجودة ضمن ادوات سطر الأوامر Visual Studio Command Line tools.
يمكن ربط أكثر من وحدة نمطية واحدة لتشكيل تجميع واحد باستخدام الأداة Al.exe (Assembly Linker), والمخطط التالي يوضح ذلك:
تتشكل كل وحدة نمطية أساساً من الأجزاء التالية:
- PE Header: مثل اي ملف Win32 PE غير مدار, تحتوي الوحدات المدارة على PE header, يحتوي PE header على معلومات حول نوع الوحدة (مدارة او غير مدارة) + معلومات حول تاريخ بناء الوحدة + نوع CPU المستهدف (x86 او x64)
- CLR Header: يحتوي على معلومات إصدار Framework المستهدف, ومعلومات حول دالة التنفيذ الرئيسية في الوحدة.
- Metadata: هي ببساطة الواجهة الرئيسية التي تقوم بتعريف ووصف الأنواع وتقديم معلومات عنها عند إضافة الوحدة التي تحتويها كمرجع reference إلى تجميع آخر. تتلخص المعلومات التي تقدمها في: الإسم والإصدار والمفتاح العمومي Public Key, الأنواع المستخدمة, التجميعات المرتبطة, أذونات الأمان Security Permissions المطلوبة أثناء التشغيل, السمات Attributes.
- تعليمات لغة Microsoft الوسيطة MSIL : عند تحويل الكود إلى ملف تنفيذي باستخدام Visual Studio او vbc.exe فإنه سيتم تحويل تلك الأكواد إلى لغة MSIL, والتي تعتمد على تنفيذ تعليماتها على شكل رصة Stack, تعتبر هذه اللغة مشتركة بين جميع لغات البرمجة التي تعتمد عليها الوت نت.
Application Domain (مجال التطبيق): هو البيئة التي يعمل عليها التطبيق حيث توفر تلك البيئة عزلاً لما يقوم به التطبيق عن باقي التطبيقات, تمكِّن الفئة AppDomain الوصول إلى مجال التطبيق الحالي, وتطبيق جملة من العمليات عليه.