السبت، 30 أكتوبر 2010

مشروع الشؤون الأدارية / 2010



 
مشروع الشؤون الأدارية
السلام عليكم ورحمة الله وبركاتة
المشروع لأخونا المبرمج الرائع / طارق التميمي


اضع بين يديكم
مشروع الشؤون الأدارية

بيئة التطوير الفجوال بيسك دت نت 2010

الواجهه الرئيسة






مشروع الشؤون الأدارية/ مفتوح المصدر/2010


اماكنية التحديث وتركيب التحديث
تلقائيا

مشروع الشؤون الأدارية/ مفتوح المصدر/2010



لتحميل المشروع اضغط
هنا


نتمنى له التوفيق و السداد بارك الله فيه

مجموعة من الأدوات المجانية والمفتوحة المصدر

مجموعة من الأدوات المجانية والمفتوحة المصدر

السلام عليكم ورحمة الله
وبعد التحية


المجموعة مقدمة من موقع www.vbaccelerator.com
حبيت اجمعها في هذا الموضوع واعمل وصف سريع لها مع إرفاق روابط السورس كود الخاصة بها دون عناء التحميل من موقع vbAccelerator


ملاحظة:
الأدوات يمكن استخدماها في كل من VB و C#
فقط أضف ملفDLL الخاص بها من خلال Choose ToolBox Items من القائمة Tools.

الكنترول الأول List Bar.NET



مجموعة الأدوات المجانية والمفتوحة المصدر




وهو يجعل الـ ToolBar الموجود في Add/Remove programs Dialog
التحميل
من هنا


------------------------------


الكنترول الثاني VS.NET ListBar Control



مجموعة الأدوات المجانية والمفتوحة المصدر




أداة TextBox شبيهة بتلك الموجودة في vs 2003


التحميل




السورس كود
من هنا


----------------------------



الكنترول الثالث Skinned ListBar




مجموعة الأدوات المجانية والمفتوحة المصدر





التحميل




السورس كود








-------------------------------------





الكنترول الرابع .NET outlook Style ListBar Control




مجموعة الأدوات المجانية والمفتوحة المصدر






ListBar شبيه بالبار الموجود في برنامج outlook Express



التحميل









السوس كود C#






----------------------------



Font ComboBox



مجموعة الأدوات المجانية والمفتوحة المصدر





لعرض الخطوط المثبتة على جهازك



السورس C#

التحميل








---------------------------------



Icon TextBox or ComboBox




مجموعة الأدوات المجانية والمفتوحة المصدر




التحميل



السورس C#






---------------------------------------



vbAccelerator IconComboBox Control



مجموعة الأدوات المجانية والمفتوحة المصدر




التحميل

DLL








السورس C#

من هنا







---------------------------------


أداة .NET ExplorerBar

مجموعة الأدوات المجانية والمفتوحة المصدر


رابط ملف DLL
من هنا

السورس كود
من هنا


نقل للفائدة تمنياتي للجميع بالتوفيق

السبت، 16 أكتوبر 2010

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (14,13)

بعون الله نبدأ الدرس الثالث عشر من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

مجالات تطبيق (أماكن عمل التطبيق في الذاكرة) - Application Domains
تزوّد بيئات وقت التشغيل Runtime وأنظمة التشغيل Operating System نوع نموذجي من العزلة بين التطبيقات. على سبيل المثال، تستعمل مايكروسوفت ويندوز الـ العمليات Process لعزل التطبيقات. هذه العزلة ضرورية لضمان الشيفرة التي تعمل في أحد التطبيقات أنها لن تقوم بالتأثير على التطبيقات لأخرى الغير مرتبطة معها بشكل عكسي.
تزوّد مجالات التطبيق Application Domains حدود عزلة للأمن Security و الثقة أو الإعتماديهReliability ، وتعدد الإصدارات Versioning ولإلغاء تحميل التجمعات Unloading Assemblies. يقوم مضيفي وقت التشغيل Runtime Hosting المسؤلين عن عملية إقلاع التطبيق Bootstrapping بإنشاء مجالات التطبيق Application Domains قبل إنتهاء عملية الإقلاع.

لمحه عن مجالات التطبيق - Application Domains Overview
تاريخياً ، تستحدم حدود العملية Process Boundaries لتقوم بعزل التطبيقات التي تعمل على حاسب واحد عن بعضها البعض و كل تطبيق يحمل في عملية Process مستقلة التي تضمن له تلك العزلة.
جميع المؤشرات في مساحة الذاكرة Memory Pointer الخاصة بالعملية Process مرتبطة بتلك العملية Process أي أن أي مؤشر Pointer في عملية Process لا معنى له في عملية Process آخرى، هذا بسبب العزلة التي يفرضها نظام التشغيل على العمليات Processes. لذلك لايمكن التعامل مع العمليات Processes الآخرى إلا عن طريق وكيل Proxy الذي يزودنا بمستوى الدخول لتلك العملية Process.
أما بنسبة للكود المدار يقوم وقت التشغيل Runtime من التحقق من الكود المكتوب Verification Code قبل عملية التنفيذ لكي لا يكون هناك أي إختراق للكتابة على عنوانين ذاكرة غير مخول للتطبيق من الكتابه عليها Invalid Memory Pointer أو أن تكون تلك العناوين تابعه لعملية آخرى، وهذا التحقق يجعل من الكود المنفذ آمن ومما يتيح وقت تشغيل اللغة المشتركة Common Language Runtime لإيجاد عزلة أقوى من ذي قبل وهذا يزيد من أداء التطبيق.
تزوّد مجالات التطبيق Application Domains وحدات آمنة أكثر من ذي قبل التي تزود وقت تشغيل اللغة المشتركة Common Language Runtime أكثر تنوع للمحافظة على حدود العملية Process Boundaries مما يتيح تشغيل أكثر من مجال التطبيق Application Domains في نفس العملية Process مما يخفف من العمليات Codes التي نحتاجها لإنتقال بين التطبيقات Application التي نقوم بتشغيلها أو المخاطبه في ما بينها.




عزل التطبيقات عن بعضها البعض وعملية التحقق من الكود المنفذ Verification Code يتيح لنا من تشغيل البرامج التي نقوم بتنزلها من الإنترنت دون الخوف من المساس بالبينات التي نقوم بتخزينها أو العبث في مصادر الجهاز أو أن تقوم بعلمية تخريب للبرامج المشغلة مسبقاً. في مايلي سنتحدث عن أهم الميزات التي يزدها عزل التطبيقات Isolation Application عن بعضها البعض:
  • • أي إخفاق في أحد التطبيقات Application لا يستطيع التأثير على التطبيقات Applications الأخرى. لأن الشيفرة من نوع الآمن Type-Safe Code لا تستطيع أن تسبّب عيوب في ذاكرة التطبيقات Applications الآخرى، يضمن إستعمال مجالات التطبيق Application Domains أن الشيفرة المنفذة في مجال واحد لا تستطيع التأثير على التطبيقات Applications الأخرى في العملية Process.
  • • إيقاف أي مجال لن يوقف العملية Process بالكامل. إستعمال مجالات التطبيق Application Domains يمكّنك لإقاف الشيفرة المنفذة في أي عملية Process دون المساس في المجالات الآخرى Application Domains المنفذة في نفس العملية Process.
  • • الشيفرة المنفذة في أحد تطبيق Applicationلا تستطيع الدخول إلى الشيفرة أو أي مصادر من التطبيق Application الآخر مباشرة. يفرض وقت تشغيل اللغة المشترك Common Language Runtime هذه العزلة بمنع النداءات المباشرة بين الكائنات Objects في مجالات التطبيق المختلفة. تستطيع الكائنات Objects أن تعبر بين المجالات عن طريق نسخ تلك الكائنات Objects أو أن دخل عن طريق وكالاء Proxy. إذا تم تمرير الكائن Objects عن طريق النسخ يتم تنفيذ الكود الخاص بذلك الكائن Object على أنه كائن Object محلي. أما إذا تم تمرير الكائن Object عبر الوكيل Proxy فيتم تنفيذه على شكل نداء بعيد ويجب أن يكون المرجع إلى ذلك الكائن Object متاح لتطبيقين ليستطيع تنفيذ الكود الملحق به.
  • • التحكم بالسلوك الذي يتبعه مجال الكود في التطيبق المنفذ. بكلمات آخرى العثور على التجمعات التي يحتاجها التطبيق ليتم إقلاعه بإمان والتعرف على أماكن تواجد الأنواع.
  • • التحكم بالتراخيص Permissions الممنوحة لكود المنفذ.
موعدنا إن شاء الله في الدروس القادمة أتمنى لكم التوفيق

بعون الله نبدأ الدرس الرابع عشر من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

مجالات التطبيق والتجمعات - Application Domains and Assemblies
قبل أي تنفيذ للكود المتواجد داخل أي تجمع Assembly لا بد لنا من تحميل ذلك التجمع Assembly ضمن مجال تطبيق Application Domains لذلك ينتج عن تشغيل برنامج إنشاء مجال تطبيق Application Domains إفتراضي من قبل وقت التشغيل ويقوم بتحميل جميع التجمعات Assemblies التي يحتاجه التطبيق في ذلك المجال Application Domains.
ويستطيع البرنامج المسؤل عن الترجمة عند الطلب في وقت التشغيل Just-In-Time (JIT) Compiler أن يتخذ قرار بشأن مشاركة التجمع Assembly إذا كان مستخدم من قبل محموعة من مجالات التطبيق Application Domains داخل العملية Process الواحدة أو عن طريق إضافة احد الخصائص لتجمع Assembly لإعلام الترجمة عند الطلب في وقت التشغيل Just-In-Time (JIT) Compiler بأننا نريد مشاركة هذا التجمع Assembly مع بقية المجالات Application Domains المستخدمة ليقوم بإعداد الازم لهذه المشاركة بأن يقوم بتغير مؤشر الوظيفة إلى المؤشر الجديد الذي يتم إنشائه من قبله في جميع مجالات التطبيق Application Domains المتشاركة في العملية Process.
نستطيع تحميل التجمع Assembly ضمن مجال التطبيق بثلاثة طرق:
1. تحميل التجمع Assembly دون مشاركة. أي أن كل مجال تطبيق Application Domains سوف يقوم بتحميل نسخة الخاصة من التجمع Assembly . يتثنى من هذه الحالة التجمع Mscorlib Assembly لأنه يتم تحميله مقبل مضيف وقت التشغيل Runtime Host ويقوم بمشاركته في جميع مجالات التطبيق Application Domains .
2. تحميل التجمع Assembly مع مشاركته. يتم تحميل التطبيق في منطقة محايدة Domain-Neutral ليتم مشاركة مع جميع مجالات التطبيق Application Domains التي تقوم بتحميل نفس التجمع Assembly مع تماثل لخيارت التحميل.
3. جعل التجمع Assembly عام ومشاركته مع جميع مجالات Application Domains التطبيق وفي جميع العمليات Processes. ملاحظة يمكن لأحد التطبيقات إستثاء هذا الخيار و تحميل نسخته الخاصة من التجمع Assembly العام الذي يريده ليعمل بشكل سليم إذا كان هناك إختلاف في رقم الإصدار ولكن كما قلنا هذا الخيار يتعامل مع التجمعات التي تحمل اسم متين Strong-Named Assemblies .

المخطط يصف كيف تقوم التجمعات في وضع مؤشر للوظيفة المستدعاة في بدء تشغيله لأول مرة وهذا ينطبق على جميع التجمعات:



وعند وضع التجمع عام أو تنفيذ الكود لمره آخرة يقوم الترجمة عند الطلب في وقت التشغيل Just-In-Time (JIT) Compiler في تغير مؤشر الوظيفة إلى مكان الوظيفة الجديده التي تمت ترجمتها وهذا ينطبق على جميع التجمعات التي يتم مشاركتها:



يجب الإنتباه في حال إتخاذ قرار بإنشاء منطقة محايده Domain-Neutral لتجمع Assembly من أداء التجمع Assembly Performance والذاكرة المستهلكة من قبل التجمع Reducing Memory Use يجب عدم وضع بيانات ساكنه Static Data كبيرة الحجم لأنه يتم عمل نسخه من هذه البيانات لكل مجال تطبيق Application Domains ليتم تطبيق العزلة Isolate Assemblies على البيانات الساكنه Static Data داخل التجمع Assembly . ويجب تزويد جميع السماحيات Permissions لهذا التجمع Assembly ليتم تطبيق سياسة الأمن Security Policy التي يتبعها نظام التشغيل Operating System .

إنتهى و الله الموفق

تمنياتي للجميع بالتوفيق و الفائدة

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (12,11)


بعون الله نبدأ الدرس الحادي عشر من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

محتويات قائمة التجمع - Assembly Manifest Contents
الجدول التالي سيعرض المعلومات المحتوى في قائمة التجمع Assembly's Manifest. أول أربع بنود Assembly Name, Version Number, Culture, And Strong Name Information تقوم بإكمال هوية التجمع Assembly's Identity.


هذه الصورة مصغره ... نقره على هذا الشريط لعرض الصوره بالمقاس الحقيقي ... المقاس الحقيقي 804x656 .


تستطيع إضافة أو تغير بعض المعلومات في قائمة التجمع Assembly's Manifest باستخدام خصائص التجمع Assembly Attributes في شيفرتك. تستطيع تغير معلومات الإصدار وخصائص المعلومات التي تحتوي على العلامة التجارية Trademark وحقوق النشر Copyright ومعلومات المنتج Product والشركة المنتجة Company ومعلومات أخرى تتعلق بخصائص الإصدار.

أماكن تخزين التجمع العام - Global Assembly Cache

يمتلك كل حاسب تم تزويده بنسخة من وقت تشغيل اللغة المشترك Common Language Runtime بأماكن لتخزين التجمعات العامة Global Assembly التي تحتوي على الشيفرة العامة Machine-Wide Code Cache التي يتم التشارك عليها من قبل جميع البرامج وتدعى أماكن تخزين التجمع العام Global Assembly Cache.
عندما تحتاج لأن تشارك التجمعات Assemblies التي قمت بتصنيعها مع أكثر من تطبيق واحد توجب عليك تركيب هذه التجمعات Assemblies في أماكن يتم التعرف عليها من قبل جميع التطبيقات وقد أصطلح خبراء مايكروسوفت بمكان افتراضي عام أطلق عليه الاسم الذي تحدثنا عنه مسبقاً أماكن تخزين التجمع العام Global Assembly Cache. وإذا لم تكن بحاجة لأن تشارك هذه التجمعات Assemblies مع جميع التطبيقات يمكنك أن تقوم بتخزينهم في نفس الدليل الذي تم تركيب التطبيق بداخله. بالإضافة أنت لست بحاجة لتقوم بتركيب التجمع في أماكن تخزين التجمع العام Global Assembly Cache إذا أردت أن تشاركه مع التطبيقات كما كنت تفعل سابقاً مع مكاتب (مكونات الكائنات النموذجية Component Object Model COM).

ملاحظة يوجد سيناريوهات تمكنك من عدم مشاركة التجمع Assembly مع التطبيقات الأخرى أي عدم تركيبه في أماكن تخزين التجمع العام Global Assembly Cache إذا كنت تريد فعل ذلك. يجب أن تنتبه في هذه الحالة إذا كنت قد قمت بوضع أحد التجمعات Assemblies التي يعتمد عليها تطبيقك في أماكن تخزين التجمع العام Global Assembly Cache، أنت لن تكون قادر على تركيب تطبيقك في الحواسب الأخرى عن طريق الأمر XCOPY ما لم تكن قد قمت بنقل هذا التجمع Assembly إلى دليل عمل التطبيق.
يوجد عدة طرق لتوزيع التجمع داخل أماكن تخزين التجمع العام Global Assembly Cache :
• استخدام أي برنامج معد لعمل برامج تركيب Installer يتعامل مع أماكن تخزين التجمع العام Global Assembly Cache. فهذا البرامج تقدم خيار لتركيب التجمعات في داخل أماكن تخزين التجمع العام Global Assembly Cache.
• أستخدم أدوات التطوير التي تدعى أدوات أماكن تخزين التجمع العام Global Assembly Cache Tool (Gacutil.exe). التي تأتي مع مجموعة أدوات التطوير .NET Framework SDK.
• استخدم مستكشف النظام ويندوز Windows Explorer لتقوم بإدراج التجمع Assembly داخل أماكن تخزين التجمع العام Global Assembly Cache.
في سيناريوهات النشر أستخدم الإصدار 2.0 من برنامج تركيب ويندوز Windows Installer 2.0 لتركيب التجمعات Assemblies بداخل أماكن تخزين التجمع العام Global Assembly Cache. استخدم مستكشف النظام ويندوز Windows Explorer أو أدوات أماكن تخزين التجمع العام Global Assembly Cache Tool لتطوير السيناريوهات، لأنهم لا يقوموا بعد مراجع التجمع ولا يقوموا بتزويد الميزات التي يزودها الإصدار 2.0 من برنامج تركيب ويندوز Windows Installer 2.0.

غالباً ما يقوم مدراء الأنظمة Administrators بحماية المجلد WINNT أو بشكل عام مجلدات النظام الهامة بأدوات تقوم بحماية الوصول العشوائي إليها وتدعى هذه الأدوات قائمة التحكم بالوصول Access Control List (ACL) ليكونوا قادرين على إعطاء سماحيات وصول للكتابة والتنفيذ والحذف لهذا المجلد. لأن أماكن تخزين التجمع العام Global Assembly Cache تركب في مجلدات النظام وهذا الأماكن تقوم بوراثة جميع خصائص الحماية من المجلد الأب أي المجلد WINNT أو المجلد الذي قمنا بحمايته. وهذه الميزات مرغوب فيها أي الصلاحيات التي يملكها مدراء الأنظمة وبعض المستخدمين الذي لديهم حق الوصول الكامل إلى مجلدات الأنظمة بإذن من مدراء الأنظمة أو كما تسمى إمتيازات مدير الأنظمة Administrator Privileges لكي لا يقوم أي شخص لا يملك حق الوصول أو المعرفة الكافية بإدارة هذه الأماكن بالوصول إلى أماكن تخزين التجمع العام Global Assembly Cache و يقوم بحذف بعض التجمعات Assemblies الهامة لعمل البرامج أو تركيب بعض البرامج التي تقوم بتغير وحذف بالتجمعات Assemblies.
يجب على جميع التجمعات Assemblies التي نقوم بتركيبها في أماكن تخزين التجمع العام Global Assembly Cache أن تملك اسم متين Strong Name. عندما نقوم بإضافة أي تجمع Assembly إلى أماكن تخزين التجمع العام Global Assembly Cache، ينجز إجراء تحقق التكامل Integrity Checks وهو التأكد من وجود التجمعات Assemblies التي يعتمد عليها هذا التجمع Assembly. وتقوم أماكن تخزين التجمع العام Global Assembly Cache بإجراء هذا التحقق ليتم التأكد بأنه لم يتم العبث في التجمعات Assemblies. على سبيل المثال إذا قام أحد المتطفلين أو أحد الأشخاص بتغير في أحد الملفات بنية التخريب أو عن غير قصد فإن قائمة التجمع Assembly's Manifest لا تعكس هذا التغير لأنه كما ذكرنا سابقاً بأن الملفات لا ترتبط مع بعضه برابط فيزيائي بل بقائمة تقوم بوصف جميع الملفات التي يعتمد عليها هذا التجمع Assembly.
الاسم المتين للتجمعات - Strong-Named Assemblies
الاسم المتين Strong Name هو عبارة عن هوية التجمع Assembly ويتضمن اسم نصي بسيط Simple Text Name ورقم الإصدار Version Number ومعلومات الثقافة Culture Information إذا وجدت ويضاف إليها أحياناً مفتاح عام Public Key و توقيع رقمي Digital Signature. وهو يولد من ملف تجمع Assembly (الملف الذي يحتوي على قائمة التجمع Assembly's Manifest ، التي تحتوي على أسماء وعلامات رقميه لكل الملفات التي تكمل هذا التجمع Assembly) يستخدم المفتاح الخاص Private Key المتطابق. مايكروسوفت فيجول ستيديو Microsoft® Visual Studio® .NET وأدوات التطوير الأخرى المزود في مجموعة مكاتب التطوير .NET Framework SDK تستطيع أن تحدد الاسم المتين Strong Name لتجمع Assembly. التجمعات Assemblies التي تملك نفس الاسم المتين Strong Name يتوقع أن تكون متماثلة.
تستطيع أن تتأكد بأن الاسم المعطى لتجمع Assembly عام وفريد إذا قمت بتوقيع التجمع Assembly باسم متين Strong Name. وعلى وجه التحديد الأسماء المتينة تحقق المتطلبات التالية:
• الاسم المتين Strong Name يضمن اسم فريد باعتماده على زوجين فريدين من المفاتيح Unique Key Pairs. ولا أحد يستطيع توليد نفس الاسم الذي قمت أنت بتوليده، لأنه يولد بمفاتيح خاص Private Key يملك اسم مختلف من تجمع Assembly ولد بمفتاح خاص Private Key آخر.
• الاسم المتين Strong Name يضمن حماية لجميع الإصدارات التي تنتسب إلى التجمع. يستطيع الاسم المتين Strong Name أن يضمن عدم إنشاء أي إصدار لاحق من التجمع. ويستطيع المستخدمون الذي تعاملوا مع أول إصدار من التجمع أن يضمنوا بأن جميع الإصدارات اللاحقة هي من نفس الشركة الصانعة لأول إصدار.
• الاسم المتين Strong Name يزود عملية ذات قوة لتحقق من التكامل. تمرر مكاتب التطوير .NET Framework تحقق الأمان لتضمن لمحتويات التجمع Assembly عدم التغير منذ إنشائها. ملاحظة: تلك الأسماء المتينة Strong Names لا تدل ضمناً على مستوى الثقة مثل تلك التي تزودها على سبيل المثال التوقيع الرقمي Digital Signature.
عندما تشير إلى تجمع ذا اسم متين، تتوقع أن تنال بعض الفائدة مثل تعدد الإصدارات وأسماء محمية. وإذا كان تجمعك Assembly لا يتضمن اسم متين Strong Name لا يستطيع أن يشير إلى أسماء متينة Strong Name لتجمعات Assemblies أخرى وبذلك تكون قد خسرت الفوائد التي تساعدك على التخلص من تعارض الإصدارات.
اعتبارات أمن التجمع - Assembly Security Considerations
عندما تقوم ببناء التجمع Assembly تستطيع أن تقوم بإضافة مجموعة من التراخيص التي يتطلبها التجمع Assembly ليتم إقلاعه بشكل سليم. ويمكن لبعض التراخيص التي قمت بتحديدها أن لا تعطى من قبل مدير النظام الذي يقوم بتحديد الصلاحيات العامة.

ويوجد طريقتين مختلتفتين لتطبيق الأمن هما:
إندماج دليل التراخيص مع ما يقدمه محمل البرنامج التنفيذي Loader في إنشاء دليل تراخيص مشترك ليتم تحديد أمن التجمع Assembly Security وتستخدم هذه الطريق عن طريق إستخدام الأوامر التالية: Assembly.Load, Assembly.LoadFrom, Activator.CreateInstance

إستخدم دليل التراخيص بدون تغير معتبرأ أنه دليل التراخيص النهائي وتستخدم هذه الطريق عن طريق إستخدام الأوامر التالية: Assembly.Load(byte[]), AppDomain.DefineDynamicAssembly().

الرخص الإختيارية يمكن أن تمنح بسياسة الأمن المحددة مسبقاً في الحاسوب حيث سيتم تشغيل التجمع Assembly.إذا أردت لشيفرتك أن تعالج كلّ إستثناءات الأمن المحتملة، يمكن عمل أحد الأشياء التاليه:

• قم بوضع جيمع التراخيص التي يحتاجة الكود الذي تقوم بكتابته، ثم قم بمعالجة جيمع الإستثنائات التي يمكن أن يحدثها الكود الذي تكتبه بسبب عدم إعطاء الصلاحيات : مثلأ عندما تقوم بفتح ملف تأكد أن: تملك صلاحية لقراءة اللف المطلوب لكي لا يفشل البرنامج بشكل كلي.

• لا تقوم بطلب الصلاحيات التي تريدها لتنفيذ الكود بل دع برنامجك يعمل ضمن الصلاحيات الممنوحة.
بعون الله نبدأ الدرس الثاني عشر من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

إصدارات التجمع - Assembly Versioning
كلّ إصدارات التجمع Assembly Versioning الذي يستخدم وقت تشغيل اللغة المشترك Common Language Runtime (CLR) يعمل في مستوى التجمع Assembly. إنّ النسخة المعيّنة لتجمع Assembly ونسخ التجمعات Assemblies التابعة مسجّل في قائمة شحن التجمع Assembly Manifest. إنّ سياسة النسخة الإفتراضية لوقت التشغيل Runtime هي النسخ التي تم بناء وإختبار التطبيق معها، مالم تقوم بتغير سياسة النسخة الموضحة في ملفات التهيئة Configuration Files (ملف التهيئة التطبيق Application Configuration File ، ملف سياسة الناشر Publisher Policy File ، وملف التهيئة مدير الحاسوب Computer's Administrator Configuration File).
ملاحظة: تعدد إصدارات التجمع Assembly Versioning تعمل مع التجمعات Assemblies التي تملك اسم متين Strong Names.
ينججز وقت التشغيل Runtime عددت خطوات ليقوم بتحدد طلبات التجمع Assembly :
1. يقوم بتحقق من الإشارة المرجعية للجمعية Assembly الأصلية ليتم تحدد الإصدار المناسب.
2. يقوم بتحقق من جميع ملفات التهيئة للتطبيق Application Configuration File ليقوم بتطبيق سياسة الإصدار المناسب.
3. يقوم بتحديد التجمع Assembly الصحيح من التجمع Assembly الأصلي المشار إليه ويقوم بجميع عمليات التحويل للإصدارت المناسبة المحدده من قبل ملفات التهيئة Application Configuration File ليتم ربطها مع التطبيق.
4. يقوم بفحص ذاكرة التجمعات العامه Global Assembly Cache ، ومن ثم الأماكن المحدده Codebases في ملفات التهيئة Configuration Files ، و من مجلدات تواجد التطبيق وجميع المجلدات الموجوده سنتحدث عن كيفية تحديد الملفات من قبل وقت التشغيل Runtime ملحقاً.

الصورة التالية تقوم بتوضيح هذه الخطوات:


معلومات الإصدار – Version Information
يملك كل تجمع طريقان متميّزان لإظهار معلومات نسخته:
• رقم الإصدار Version Number يحدد رقم نسخة التجمع Assembly ، عن طريق باسم التجمع Assembly ومعلومات الثقافة Culture Information. ويستخدم رقم التجمع Assembly من قبل وقت التشغيل Runtime لفرض سياسة النسخة و الجزء الرئيسي في عملية قرار تحديد الأنوع في وقت التشغيل Runtime.
• المعلومات الإضافية للإصدار Informational Version هي عبارة عن نص موجود لأغراض معلوماتية فقط.


رقم الإصدار - Version Number
يملك كل تجمع رقم ويعتبر جزء من هويته، ويعتبر وقت التشغيل Runtime التجمعان الذان يحملان رقمين إصدارين مختلفين تجمعان مختلفان، ورقم الإصدار المحدد مقسم إلى أربعة أقسام تتبع هذه الصيغة:
<Major Version>.<Minor Version>.<Build Number>.<Revision>
<رقم الإصدار>.<رقم ثانوي>.<عداد البناء>.<التنقيح>
على سبيل المثال الإصدرا ذا الرقم 1.5.1254.0 يحدد يحدد 1 رقم الإصدار Major Version و 5 الرقم الثانوي Minor Version و1254 عداد البناء Build Number و0 رقم التنقيح Revision .
إنّ رقم النسخة Version Number مخزن في قائمة شحن التجمع Assembly Manifest مع معلومات الهوية الأخرى، بتضمن ذلك اسم التجمع Assembly Name والمفتاح العامّ Public Key ، بالإضافة إلى معلومات عن العلاقات وهويّات الجمعيات الأخرى المرتبطه بالتطبيق.

عندما يتم بناء التجمع Assembly ، تسجّل أداة التطوير معلومات تبعية لكل تجمع Assembly في قائمة شحن التجمع Assembly Manifest. يستخدم وقت التشغيل Runtime رقم الإصدار Version Number ، بالإتحاد مع معلومات التهيئة Configuration Information الموضوعة من قبل مدير التطبيق، أو الناشر، لتحميل النسخة الصحيحة للتجمع المشار إليه.
يميّز وقت التشغيل Runtime بين التجمع Assembly الذي يملك أسم متين Strong Name والتجمعات الطبيعية Assemblies Regular لأغراض الإصدارات، تدقق التجمعات Assemblies التي تحمل اسم متين Strong Name فقط.

المعلومات الإضافية للإصدار - Assembly Informational Version
المعلومات الإضافية للإصدار Assembly Informational Version كما ذكرنا سابقاً أنها عبارة عن نص يضيف معلومات إضافية عن نسخة التجمع Assembly للأغراض المعلوماتية فقط، ولن تستخدم هذه المعلومات في وقت التشغيل Runtime. مهمتها إضافة بعض الخصائص عن المنتج التسويقي مثل الاسم أو اسم المنتج. أو على سبيل المثال أن منتجك يحتاج لـ "Common Language Runtime version 1.0" أو بعض الملفات الإضافية مثل ".NET Control SP 2" وتضهر هذه المعلومات في خصائص الملف في التبويب Version الخاصية "Product Version" .

تحديد مكان التجمع - Assembly Placement
يتم تخزن أسماء التجمع في الملفات التنفيذي التي يحتاج إليها التطبيق مهملين نوع الملف على سبيل المثال : قمنا بإنشاء تطبيق يحتاج إلى مكتبه Asmdll.dll تخزن في الملف على الشكل التالي Asmdll مهملين النوع. لذلك يقوم Common Language Runtime CLR بعدة خطوات للعثور على التجمع Assembly الذي يحتاج إليه التطبيق الذي يتم تشغيله يقوم بالنظر في المجلد الذي تم الإقلاع منه فإن لم يجد التجمع Assembly المناسب يقوم بالبحث في المجلدات الفرعية التي تحمل اسم التجمع Assembly المراد فإن لم يجد يقوم بالبحث عن مجلد اسمهprivatePath1 أو privatePath2 فإن لم يجد يبحث في نفس المجلد عن مجلد يحمل اسم التجمع Assembly فإن لم يجد يتجه إلى أماكن تخزين التجمع العام Global Assembly Cache فإن لم يجد يعتبر أن التجمع المراد البحث عنه من نوع EXE ويعاود البحث مرى آخرى مستخدماً الخطوات السابقة وإن لم يجد يقوم بإصدار إسثناء يدل ان التجمع الذي يتم البحث عنه غير متواجد. مثال على ذلك:
كود
 
 
AppBase\AsmName.dll
AppBase\AsmName\AsmName.dll
AppBase\privatePath1\AsmName.dll
AppBase\privatePath1\AsmName\AsmName.dll
AppBase\privatePath2\AsmName.dll
AppBase\privatePath2\AsmName\AsmName.dll

وإن لم يجد كما ذكرنا سابقاً يعتبر أن الملف ملف تنفيذي:
كود
 
AppBase\AsmName.exe
AppBase\AsmName\AsmName.exe
AppBase\privatePath1\AsmName.exe
AppBase\privatePath1\AsmName\AsmName.exe
AppBase\privatePath2\AsmName.exe
AppBase\privatePath2\AsmName\AsmName.exe

ونستطيع تغير عملية البحث التي يقوم بها Common Language Runtime CLR عن طريق كتبة الخصائص في ملفات التهيئة Application Configuration File نستطيع أن نضع الملف في إي مكن على الشبكة أو على الحاسب المستخدم ونكتب في <codeBase> Element مكان تواجد التجمع وهذا مفيد في أغلب الأحيان لأننا نستطيع أن نترك لمدراء النظام أن يقوم بتغير أماكن التجمع إلى أي مكان يرغبون فيه. مثال على ذلك :

كود
 
<?xml version="1.0" encoding="utf−8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas−microsoft−com:asm.v1">
<probing privatePath="AuxFiles;bin\subdir" />
<dependentAssembly>
<assemblyIdentity name="Asmdll"
publicKeyToken="32ab4ba45e0a69a1" culture="neutral"/>
<bindingRedirect
oldVersion="1.0.0.0" newVersion="2.0.0.0" />
<codeBase version="2.0.0.0" href="http://www.Arabteam2000.com/Asmdll.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="FredTypes"
publicKeyToken="1f2e74e897abbcfe" culture="neutral"/>
<bindingRedirect
oldVersion="3.0.0.0−3.5.0.0" newVersion="4.0.0.0" />
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

موعدنا إن شاء الله في الدروس القادمة أتمنى لكم التوفيق

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (10,9)


بعون الله نبدأ الدرس التاسع من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

التجمعات – Assemblies
التجمعات Assemblies هي كتل مبنية مع التطبيقات التي تعتمد على مكتبة التطوير .NET Framework، و يشكلون الوحدة الأساسية للانتشار Fundamental Unit Of Deployment والتحكم بالإصدار Version Control وإعادة الاستخدام Reuse وتنشيط مجال التطبيق Activation Scoping وتراخيص الأمن Security Permissions. التجمع Assembly هو مجموعة الأنواع Types والمصادر Resources التي تبنيان لكي تعملا سوية وتشكيل وحدة منطقية من الوظائفية. يزود التجمع Assembly وقت تشغيل اللغة المشترك Common Language Runtime بالمعلومات التي يحتاجها لكي يكون قادر على إدرك الأنواع المستخدمة في التطبيقات. في وقت التشغيل Runtime، لا يمكن أن تجد نوع Type خارج سياق التجمع Assembly.
لمحة عن التجمعات - Assemblies Overview
التجمعات Assemblies هي جزء أساسي من البرمجة مع مكاتب التطوير .NET Framework. والتجمع Assembly ينجز الوظائف التالية:

• تضم الشيفرة التي ستنفذ من قبل وقت تشغيل اللغة المشترك Common Language Runtime. تتواجد هذه الشيفرة داخل ملفات تنفيذية قابلة للنقل Portable Executable (PE) File مكتوبة بلغة مايكروسوفت الوسيطة Microsoft Intermediate Language (MSIL) ولن تنفذ هذه الشيفرة ما لم تترافق مع بيان تجمع Assembly Manifest. ونلاحظ بأن كل تجمع Assembly يستطيع أن يملك نقطة دخول واحدة فقط مثل (DllMain, WinMain, or Main).
• يشكل حدود الأمن. التجمع Assembly هو الذي يعطي التراخيص لطلبات والأوامر. لمزيد من المعلومات عن حدود الأمن التي تطبق على التجمعات Assemblies أنظر إلى مناقشة اعتبارات أمن التجمع Assembly Security Considerations .
• يشكل حدود للأنواع. كل هوية لنوع تتضمن اسم التجمع التي تقيم فيه. على سبيل المثال إذا كان لديك نوع يَحمل الاسم MyType ويقيم في مجال أحد التجمعات فهو ليس نفس النوع الذي يقيم في تجمع آخر ويَحمل الاسم MyType.
• يشكل حد لنطاق المرجع. بيان التجمع Assembly's Manifest يحتوي على معلومات التجمع Assembly Metadata التي تستخدم لتعرف على الأنواع وتلبي حاجتها من المصادر. يحدد الأنواع والمصادر التي تقيم خارج التجمع Assembly. وبيان التجمع Assembly's Manifest يعدد أيضاً التجمعات Assemblies الأخرى التي يعتمد عليه هذا التجمع Assembly.
• شكل من حدود الإصدار. التجمع Assembly هو أصغر وحدة قابلة لأن تحمل نوع الإصدار في وقت تشغيل اللغة المشترك Common Language Runtime، كل الأنواع والمصادر التي تقيم في التجمع Assembly تحمل نفس نوع الإصدار من هذا التجمع Assembly. تصف قائمة التجمع Assembly's Manifest تصف إصدار جميع التجمعات Assemblies التي تتبع لهذا التجمع Assembly. لمزيد من المعلومات أنظر إلى مناقشة تصدير التجمع Assembly Versioning .
• يشكل وحدة انتشار. عندما يبدأ التطبيق، فقط التجمعات Assemblies التي يطلب التطبيق استدعاءها بشكل أولي يجب أن تقدم. التجمعات Assemblies الأخرى، مثل المصادر المحلية أو التجمعات Assemblies التي تحتوي على أصناف خدماتيه Utility Classes، يمكن أن تسترجع عند الطلب. هذا يسمح للتطبيقات أن تحتفظ ببساطة ورقه عندما تحمل لأول مرة. للمزيد من المعلومات حول نشر التجمعات، أنظر نشر التطبيقات Deploying Applications.
• إنه الوحدة التي تدعم التنفيذ خطوة بخطوة Side-By-Side Execution. للمزيد من المعلومات حول تشغيل الإصدارات المتعددة لتجمع، أنظر تنفيذ التجمعات خطوة بخطوة Assemblies and Side-by-Side Execution.

يمكن للتجمعات أن تكون ساكنة Static أو دينامكية Dynamic. يمكن أن تتضمن التجمعات الساكنة Static Assemblies أنواع مكاتب التطوير .NET Framework Types مثل( واجهات Interfaces وأصناف Classes )، وأيضا مصادر يمكن أن تستخدم في التجمع مثل ( صور نقطية Bitmaps وملفات صور أخرى مثل ملفات JPEG وملفات مصادر Resource Files، وهكذا ). تخزن التجمعات الساكنة Static Assemblies على وحدات التخزين الدائمة في ملفات تنفيذية قابلة للنقل Portable Executable (PE) Files. كما يمكنك أن تستخدم مكاتب التطوير .NET Framework لكي تنشأ تجمعات دينامكية Dynamic Assemblies أيضاً، التي تعمل بشكل مباشر في الذاكرة ولا تحفظ في وحدات التخزين الدائمة قبل التنفيذ. يمكنك أن تحفظ التجمعات الدينامكية Dynamic Assemblies في وحدات التخزين الدائمة بعد تنفيذهم.

هناك عدة طرق لإنشأ تجمعات Assemblies. يمكنك أن تستخدم أدوات التطوير Development Tools، مثل الإصدار الحديث من فيجول أستوديو Visual Studio .NET، الذي قد استخدمته في الماضي لإنشاء مكاتب ديناميكية .DLL أو ملفات تنفيذية .EXE. يمكنك أن تستخدم الأدوات الموجودة مع مجموعة مكاتب التطوير .NET Framework SDK لإنشاء تجمعات Assemblies من وحدات Modules أنشئت في بيئات التطوير الأخرى. كما يمكنك أن تستخدم أيضاً وظائف وقت تشغيل اللغة المشترك Common Language Runtime APIs.

موعدنا إن شاء الله في الدروس القادمة أتمنى لكم التوفيق .

بعون الله نبدأ الدرس العاشر من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

الاستفادة من المجمعات - Assembly Benefits

صممت المجمعات Assemblies لتبسيط تطوير التطبيقات ولتحل الخلاف الناتج من تعدد الإصدارات للمكونات الرئيسية التي تعتمد عليها التطبيقات.

المستخدمون والمطورون متآلفين مع تعدد الإصدارات وقضايا الانتشار التي ظهرت من تطوير المكونات الرئيسية لأنظمة اليوم. بعض المستخدمون لتطبيقات قد جربوا المشاكل التي تحدث عند تركيبهم تطبيق جديد على حاسبهم، ويتم اكتشاف المشكلة عندما يحاول المستخدم تشغيل تطبيق تم تركيبه مسبقاً ويجد أن هذا التطبيق قد توقف عن العمل بسبب بعض الإصدارات الحديثة التي تم تركيبها من قبل الإصدار الجديد. العديد من المطورين قد صرفوا ساعات غير معدودة محاولين أن يحفظوا كل مداخل مكتبة التسجيل الضرورية بالترتيب السابق لإصداراتهم الجديدة ليتم التوافق مع الإصدارات القديمة من تطبيقاتهم.
العديد من مشاكل الانتشار حلت باستخدام التجمعات Versioning في مكاتب التطوير NET Framework. لأنهم عبارة عن مكونات تحمل وصف ذاتي لجميع المكونات التي تعتمد عليها أي لا تملك أي تبعية في مداخل محرر التسجيل، يمكن لتجمعات Assemblies أن تنهي مشاكل تركيب التطبيقات. كما تبسط إلغاء تركيب التطبيقات وتكرار التطبيقات.
مشاكل التصدير - Versioning Problems
يمكن لإصدارين من نفس التطبيق أن يحدثوا مشاكل في نظام التشغيل ويندوز صاحب الإصدار 32 WIN32 Application:

• لا يمكن لقواعد التصدير أن تظهر بين أجزاء التطبيق والقوانين التي يفرضها نظام التشغيل Operating System. يعتمد الاقتراب إلى قواعد التصدير على التوافقية الرجعية Backward Compatibility بين الإصدارات والتي يكون من الصعب ضمانها.ويعني ذلك أننا يجب أن نحافظ على واجهة التخاطبInterface بين أول إصدار و جميع الإصدارات التي ربما نقوم بتطويرها. ولكن الشيفرة التي نقوم بكتابتها تكون نموذجية Typical أي الشيفرة المصممة تكتب من أجل إصدار واحد فقط ويمكن أن يعمل على أي حاسب في أي وقت كان.
• لا يوجد طريقة لضمان التماسك بين مجموعة المكونات التي تبنى مع بعضها والمجموعات التي تقدم في وقت التشغيل Run Time.

هذه المشاكل لإصدارين مختلفين يمكن أن ينشأ تعارض بين المكاتب البرمجية التي تعتمد عليها التطبيقات، حيث تركيب أحد التطبيقات على الحاسب يمكن أن يقوم بغير قصد توقف لبعض التطبيقات لأنها تعتمد على بعض المكاتب التي قام التطبيق الجديد بتحديثها وهي لا تمتلك توافق الرجعي مع الإصدارات القديمة. وللأسف لا يمتلك نظام التشغيل أدوات تكتشف مثل هذه الأخطاء لتقوم بحلها دون تدخل من أحد.

نهاية التضارب بين المكاتب البرمجية - An End to DLL Conflicts

بدأ نظام التشغيل ويندوز 200 Microsoft® Windows® 2000 بمعالجة مثل هذه المشاكل. وقد امتلك ميزتين تقوم بحل هذا التضارب بشكل جزئي:
• يمكن نظام التشغيل ويندوز 200 Microsoft® Windows® 2000 المبرمج بتركيب التطبيق وجميع المكاتب التي يعتمد عليها في نفس الدليل. ودور نظام التشغيل ويندوز 200 Microsoft® Windows® 2000 هنا حين يقوم بتحميل التطبيق يقوم بالتأكد من وجود المكاتب التي يعتمد عليها التطبيق في نفس الدليل الذي أقلع منه ويهمل المسار الكامل لهذه المكاتب. مما يسمح لتطبيقات أن تعمل مع بعضها مع نفس المكاتب المطلوبة ولكن بإصدارين مختلفين وموقعين مختلفين.
• يقوم نظام التشغيل ويندوز 200 Microsoft® Windows® 2000 بقفل جميع المكاتب التي شحنت معه في المجلد System32 وبالتالي لا يمكن لأحد التطبيقات أن يقوم بتغير غير مقصود لمكاتب النظام بإصدارات حديثة فأي تطبيق يحتاج لأحد المكاتب من إصدار جديد يقوم بتركيبها في نفس المجلد الذي قد ركب فيه.
يستخدم وقت تشغيل اللغة المشترك Common Language Runtime المجمعات Assemblies ليستمر بتطوير حل شامل لهذا التضارب.

الحل الذي يقدمه التجمع - The Assembly Solution
لحل مشكلة التصدير وجميع المشاكل التي تقود لتضارب بين المكاتب، وقت التشغيل Runtime يستخدم المجمعات Assemblies لتقوم بعمل مايلي:
• تمكين المطورين بتحديد قواعد الإصدارات بين جميع التطبيقات المختلفة.
• تزويد بنية تحتيه تقوم بإجبار استخدام قواعد التصدير.
• تزويد بنية تحتيه تسمح لأكثر من نسخة من نفس التطبيق بالعمل بشكل متزامن مع بعضها البعض ( تدعى هذه التقنية التنفيذ جنب إلى جنب Side-By-Side Execution ).
محتويات التجمع - Assembly Contents
بشكل عام التجمع الثابت يضم أربعة عناصر:
• بيان التجمع Assembly's Manifest الذي يحتوي على معلومات البيانات Metadata.
• معلومات بيانات Metadata تخص الأنواع.
• شيفرة مايكروسوفت الوسيطة Microsoft Intermediate Language (MSIL) Code التي تنجز الأنواع.
• مجموعة من الخصائص.
العنصر الأول بيان التجمع Assembly's Manifest مطلوب لا يمكن الاستغناء عنه فقط. لكن الأنواع والمصادر الأخرى مهمتها إعطاء التجمع معنى وظيفي ذا أهمية.
يوجد عدة طرق لتجميع هذه العناصر في التجمع. وتستطيع تجميع هذه العناصر في ملف واحد. أنظر الشرح التالي.



بدلاً عن ذلك، يمكن لعناصر أي تجمع Assembly أن توزع في عدة ملفات. ويمكن لهذه الملفات أن تكون وحدات Module لشيفرة مترجمة (.NETMODULE)، أو مصادر (مثل ملفات الصور .BMP أو .JPG)، أو ملفات أخرى يتطلبها التطبيق. أنشئ عدة ملفات تجمع Assembly عندما تريد أن تجمع وحدات Modules كتبت في لغات مختلفة ولتحسين تحميل التطبيق بوضع الأنواع قليلة الإستخدام في وحدات منفصلة Separate Modules تحمل حين الإشارة إليها بدلاً من تحميلها في بداية الإقلاع.
في الإيضاح التالي، مطور التطبيق الافتراضي قد اختار أن يفصل بعض الشيفرة التي تخدم التطبيق Utility Code في وحدات Modules مختلفة و حفظ ملفات المصادر الكبيرة ( في هذه الحالة ملف صورة من نوع .BMP) في ملفه الأصلي. تقوم مكاتب التطوير .NET Framework بتحميل الملف فقط عندما يتم الإشارة إلى أحد مكوناته، وحفظ المراجع النادرة الاستخدام في ملفات منفصلة يسرع في عملية تحميل التطبيق.
ملاحظة الملفات التي أنشأت لتشكل عدد من التجمع Multifile Assembly لا ترتبط بشكل فيزيائي في ما بينها في نظام ملفات النظام. على الأصح هم يربطون خلال قائمة التجمع Assembly's Manifest ووقت تشغيل اللغة المشترك Common Language Runtime يديرهم كوحدة واحدة.
في هذا الإيضاح، كل ثلاثة ملفات تنتمي إلى تجمع، كما وصف في قائمة التجمع Assembly's Manifest المحتويين في MYASSEMBLY.DLL. أما بالنسبة إلى نظام الملفات هم ثلاثة ملفات منفصلة. لاحظ أن الملفUTIL.NETMODULE قد جمع كوحدة قياسية لأنه لا يحتوي على معلومات تجمع. عندما أنشئ التجمع، أضيف إلى قائمة التجمع Assembly's Manifest التابعة إلى MYASSEMBLY.DLL إشارة إلى علاقة تربطه مع UTIL.NETMODULE و GRAPHIC.BMP.

عند تصميمك شيفرتك المصدرية Source Code مسبقاً، كنت تضع قرارات واضحة حول كيفية تقسيمك للوظائف التي ستكتبها لتطبيقك في ملف أو أكثر. أما الآن عند تصميمك شيفرة تستخدم مكاتب التطوير .NET Framework، أنت ستضع قرارات مشابهة حول كيفية تقسيمك للوظائف في تجمع واحد Assembly أو أكثر.

قائمة التجمع - Assembly Manifest

كل تجمع Assembly سواءً كان ساكن أو ديناميكي ، يحتوي على مجموعة من البيانات التي تقوم بوصف كيفية ترابط أجزاء التجمع Assembly في بينها. قائمة التجمع Assembly's Manifest تشمل المعلومات التي تعرف هذا التجمع Assembly Metadata. قائمة التجمع Assembly's Manifest تحتوي على جميع المعلومات Metadata التي يحتاجها لتحديد متطلبات إصدار التجمع Assembly's Version والهوية الأمنية Security Identity، وكل المعلومات Metadata التي يحتاجها لتعريف مدى التجمع Scope Of The Assembly ويقوم بحل جميع المراجع References والمصادر Resources والأصناف Classes.
تستطيع قائمة التجمع Assembly's Manifest أن تخزن في إحدى أنواع الملفات التنفيذية القابلة لنقل Portable Executable (PE) File (An .EXE or .DLL) مع لغة مايكروسوفت الوسيطة Microsoft Intermediate Language أو في ملف تنفيذي قابل لنقلStandalone Portable Executable (PE) File وحيد يعتمد على نفسه الذي يحتوي على معلومات قائمة التجمع Assembly's Manifest فقط.

التوضيح التالي سيبين كيف يمكننا تخزين قائمة التجمع Assembly's Manifest في طرق مختلفة.


تندمج القائمة لتجمع Assembly متعلق في ملف واحد داخل ملف تنفيذي قابل لنقل Portable Executable (PE) File لتشكل ملف تجمع وحيد Single-File Assembly. وتستطيع أن تنشأ أكثر من تجمع Multifile Assembly ضمن قائمة تخزن في ملف آخر Standalone Manifest أو ضمن قائمة Manifest تخزن في الملف التنفيذي القابل لنقل Portable Executable (PE) File.
كل قائمة لتجمع Assembly's Manifest تنجز الوظائف التالية:
• التعرف على الملفات التي تشكل التجمع Assembly.
• يتحكم بكمية الإشاراة إلى أنواع التجمع Assembly's Types والمصادر Resources Map التي تخطط إلى الملف الذي يحتوي على تصاريحهم وشيفرتهم المنجزة.
• التعرف على التجمعات Assemblies الأخرى التي يعتمد عليها التجمع Assembly Depends.
• تزود مستوى غير مباشرة Level Of Indirection بين مستهلكين التجمع Assembly و تفاصيل الشيفرة التي تطبق التجمع Assembly's Implementation Details.
• يقدم وصف ذاتي لتجمع Assembly Self-Describing.


موعدنا إن شاء الله في الدروس القادمة أتمنى لكم التوفيق

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (8)

بعون الله نبدأ الدرس الثامن من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

هناك مشكلة في التعريب: عند محاولتي لتعريب المصطلحات البرمجية ولكني أثرت دائماً على كتابة المصطلح بلغته في جميع هذه الدروس أعذروني على تعريبي لهذه المصطلحات التي يمكن أن تكونوا غير متألفين عليها فأتمنى أن تحفظوها في لغتها على أنه مصطلح غير قابل لتعريب.

أنواع النظام المشتركة - Common Type System (CTS)
تعرف أنواع النظام المشتركة Common Type System (CTS) كيفية التصيريح وأستخدامم وأدارة النوع Type في وقت التشغيل Runtime وهي أيضاً من أهم الأجزاء التي تدعم التوفقية بين تعددية اللغات المستخدمة cross-language integration. ينجز أنواع النظام المشتركة Common Type System (CTS) الوظائف التالية :
• يأسس المكاتب التي تساعد على التوفقية بين تعددية اللغات المستخدمة cross-language integration و أنواع أمنه وتنفيذ عالي الأداء للكود.
• يزود أنواع يمكن إعادة إستخدامها والتطوير عليها (نماذج غرضية التوجه Object-Oriented Model).
• تعريف مجموعة من القواعد التي يجب أن تتبعها جميع اللغات في تعريف الأنواع Types لكي تضمن توافقية في تصدير الكود بين اللغات وتساعد من التأكد من الكائن المنشأ في أحد اللغات يمكن أن يتفاعل مع لغات مختلفة.
لمحة عن أنواع النظام المشتركة - Common Type System (CTS) Overview
يصف هذا القسم المفاهيم لأنواع النظام المشتركة Common Type System (CTS) ويعرّف الشروط التي ستساعدك على فهمها كيفية العمل معها في لغتك:
تصنيف الأنواع - Classification of Types
تدعم أنواع النظام المشتركة Common Type System (CTS) نوعين رئيسيين:
• نوع القيمة Value types
وهو عبارة عن منطقة في الذاكرة تقوم بتخزين مباشر للبيانات, وأي حالة Instances من هذا النوع تخزن مباشرة في مكدس العملية stack أو تخزن مباشرة في التنظيم, أو تأتي معرفة مسبقاً داخل وتنجز أثناء التشغيل وكأمثله عليه : البيانات المعرفة من قبل المستخدم User-Defined Type – التعداد Enumeration
• نوع الإشارة Reference types
وهو عبارة عن منطقة في الذاكرة تقوم بتخزين مؤشر لعناوين للبيانات وجميع هذه الأنواع تخزن في منطقة في الذكرة تابع للبرنامج يطلق عليها اسم الكومه Heap أنواع الإشارة Reference types يمكن أن تكون أنواع وصف ذاتية،أمثله على هذه الأنواعPointer types أو Interface typesالنوع من نوع الإشارة Reference types يمكن أن تحدد من قيم أنواع الوصف الذاتية. الأنواع ذات الوصف الذاتي تنقسم إلى أنواع المصفوفات Array والصفوف Class. إنّ أنواع الصنف Class أصناف معرّفة من قبل المستخدم, الأصناف المعلبة Boxed Value Types والمندوبين Delegates.
المتحولات التي تكون من نوع القيمة Value types كل متحول يملك نسخته الخاصة للبيانات، ولذا العمليات التي نقوم بها على متحول لا تؤثّر على المتحولات الأخرى. نوع المتحولات التي تكون من نوع الإشارة Reference types يمكن أن تشير إلى نفس الكائن Object ،لذلك العمليات التي نقوم بها على متحول سوف تؤثّر على نفس الكائن Object المشار إليه لذلك حميع المتحولات التي تشير على نفس الكائن يمكنها أن ترى التغير الذي حدث علية.
تشتقّ كل الأنواع من System.Object الأساسي.
سنرى في المثال التالي الإختلاف بين أنواع الإشارة وأنواع القيمة


كود
 
Imports System
Class Class1
Public Value As Integer = 0
End Class 'Class1
Class Test
Shared Sub Main()
Dim val1 As Integer = 0
Dim val2 As Integer = val1
val2 = 123
Dim ref1 As New Class1()
Dim ref2 As Class1 = ref1
ref2.Value = 123
Console.WriteLine("Values: {0}, {1}", val1, val2)
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
End Sub 'Main
End Class 'Test

كود
 
using System;
class Class1
{
public int Value = 0;
}
class Test
{
static void Main() {
int val1 = 0;
int val2 = val1;
val2 = 123;
Class1 ref1 = new Class1();
Class1 ref2 = ref1;
ref2.Value = 123;
Console.WriteLine("Values: {0}, {1}", val1, val2);
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
}
}

كود
 
Values: 0, 123
Refs: 123, 123

وكل نوع من هذه الأنواع مقسم إلى مجموعة من الأقسام.
يبين المخطط التالي العلاقة بين الأنواع المختلفة. ملاحظة تلك الحالات Instances من الأنواع يمكن أن تكون نوع القيمة Value typesأو أنواع وصف ذاتية، بالرغم من أنّ هناك أصناف مشتقة من هذه الأنواع.

هذه الصورة مصغره ... نقره على هذا الشريط لعرض الصوره بالمقاس الحقيقي ... المقاس الحقيقي 701x389 .



القيم والكائنات Values and Objects
القيم تمثيل ثنائي من البيانات، والأنواع تزوّد طرق لترجمة هذه البيانات. ونوع القيمة Value typesمخزنه مباشرة كتمثيل ثنائي البيانات. إنّ نوع الإشارة Reference types مؤشر لموقع سلسلة من القطع التي تمثّل البيانات.
كلّ قيمة لها نوع مضبوط الذي يعرّف تمثيل القيمة بالكامل والعمليات المعرّفة على القيمة. قيم أنواع الوصف الذاتية تدعو الكائنات Object. بينما هو محتمل دائما لتقرير النوع المضبوط لجسم بفحص قيمته، أنت لا تستطيع عمل ذلك مع نوع قيمة أو نوع مؤشر .قيمة يمكن أن تأخذ أكثر من نوع واحد. الأنواع التي تطبّق وصلةInterface أيضا هي قيمة من نوع الوصلة الذي طبقته. على نفس النمط :الأنواع التي تشتقّ من نوع أساسي Base Typeأيضا هي قيمة من نوع ذلك الصنف الأساسي الذي أشتقت منه.
كود
 
Class Class1 
Implements MyInterface
{
……
}

Dim obj As Class1 = new Class1();
Dim obj As MyInterface = new Class1();


الأنواع والتجمعات Types and Assemblies
يستخدم وقت التشغيل Runtime التجمعات لتحديد أماكن الأنواع ليقوم بتحميلها. تحتوي قائمة شحن الجمعية Assembly Manifest المعلومات التي يستخدم وقت التشغيل Runtimeليقوم بحل كلّ إشارات النوع التي جعلت ضمن مجال التجمع.
ينقسم اسم النوع في وقت التشغيل Runtime إلى قسمين منطقيّان: اسم التجمع واسم النوع ضمن التجمع. النوعان اللذان يملكان نفس الاسم ولكن في تجمعات المختلفة يعرفوا كنوعان مختلفين.
تزوّد التجمعيات إتساقا بين مجال الأسماء التي يراها المطوّر ومجال الأسماء من منظور المكاتب المستخدمه لتطوير. مثال نستطيع أن نقوم بإنشاء نوع مطلقين عليه اسم موجود مسبقاً ولكن في تجمع آخر
الأنواع وفضاء العناوين Types and Namespace
من جهة نظر وقت التشغيل Runtime فضاء العناوين Namespace ليس إلا مكان لتخزين أسماء الأنواع يمكن لإحد اللغات أن تقوم بعملية تسهيل للمبرمجين بأن يتم حذف اسم النوع الكامل ولكن كما قلنا مسبقأ فهذا لتسهيل فقط يعني عندما تقوم بإحدى اللغات بكتابة String حصراً سو ف يراه وقت التشغيل Runtime بالاسم الكامل System.String

تعريف الأنواع Type Definitions
نحن نقوم بتعريف أنواعنا عن طريق الأنواع المبني داخلأ Built-in value types مثل Int – Boolean … أو المؤشرات Pointers أو المصفوفات Arrays أو المندوبين Delegates. ويمكن لهذه الأنواع أن تتراكب ضمن بعضها البعض.
يتضمن تعريف الأنواع:
• الصفات Attributes التي تعرف على النواع.
• مدى رؤية النوع (مجال الرؤيه) Type Accessibility.
• أسم النوع.
• النوع الأساسي للنوع Base Type.
• الوجهات interfaces التي يرثها النوع.
• التعاريف لكلّ من أعضاء النوع Members.
الصفات Attributes
تزيد خصائص إذافية من قبل المبرمج: وتطبق على أغلب عناصر اللغة مثل الأنواع Types , الخصائص Properties، والمناهج Methods ... إلخ
مجال الرؤيا Type Accessibility
كلّ الأنواع لها معدّل وصول الذي يحكم وصول الأنواع الأخرى إليها. يصف الجدول التالي طرق الوصول Accessibilities المدعومه من قبل وقت التشغيل RunTime.

هذه الصورة مصغره ... نقره على هذا الشريط لعرض الصوره بالمقاس الحقيقي ... المقاس الحقيقي 885x158 .


الوصول إلى الأنواع المتراكبه ضمن النواع مرتبط إلى نوع مجال رؤيته ومحال رؤية مكان تواجد النوع على ذلك نبين أنه لا يمكن لأي عضو تجاوز رؤية المجال المصرح بداخله
لتوضيح ذلك نفترض لدينا عضو ما نطلق عليه اسم X في صنف قمنا بإنشائه مطلقين عليه اسم MyClass في احد البرامج ونطبق عليه مجالات الرؤيا Type Accessibility :
كود
 
Accessibility Class MyClass
Accessibility X :: Integer
End Class

• إذا قمنا بتعريف الصنف MyClass Class بـ Private سوف يكون مجال رؤية العضو X Members ضمن هذا النوع فقط
• إذا قمنا بتعريف الصنف MyClass Class بـ Internal C#– Friend VB سوف يكون مجال رؤية العضو X Members ضمن هذا التجمع Assemblies ومرتبط برؤية مجال النوع التي سوف نأتي على ذكرها بعد قليل.
• إذا قمنا بتعريف الصنف MyClass Class بـ Internal C#– Friend VB أوPublic سوف يكون مجال رؤية العضو X Members مرتبط على حسب تعريفه:
 إذا قمنا بتعريف مجال رؤية العضو X Members بـ Private لن نستطيع رؤية هذا العضو Members من خارج الصنف MyClass Class .
 إذا قمنا بتعريف مجال رؤية العضو X Members بـ Public نستطيع رؤية هذا العضو Members من خارج الصنف MyClass Class .
 إذا قمنا بتعريف مجال رؤية العضو X Members بـ Internal C#– Friend VB نستطيع رؤية هذا العضو Members من خارج الصنف MyClass Class ولكن ضمن هذا التجمع Assemblies.
 إذا قمنا بتعريف مجال رؤية العضو X Members بـ Protected لن نستطيع رؤية هذا العضو Members من خارج الصنف MyClass Class إلا إذا قمنا بوراثة هذا الصنف أي من ضمن الأصناف المشتقة derived .
 إذا قمنا بتعريف مجال رؤية العضو X Members بـ Protected Internal C#– Protected Friend VB نستطيع رؤية هذا العضو Members من خارج الصنف MyClass Class ولكن ضمن هذا التجمع Assemblies و من ضمن الأصناف المشتقة derived .

أسم النوع Type Names
يفرض نواع النظام المشتركة Common Type System (CTS) قيدين فقط على الأسماء:
1. كلّ الأسماء مشفّرة كنصوص نظام الحروف الدولي الموحد (16 بت) Unicode (16-bit) characters .
2. لاي يسمح للأسماء أن تتضمن قيمة 0x0000 .
كلّ المقارنات تعمل على قاعدة بايت بايت byte-by-byte ، وهو حساس لحالت الحروفحcase-sensitive ومكان التعريف.
بما أننا نستطيع الوصول إلى الأنواع من قبل تجمعات Assemblies آخرى، لذلك يجب على الأسم أن يحمل أسم فريد ضمن فضاء الأسماء Namespace المعرف بداخلة لأن نواع النظام المشتركة Common Type System (CTS) يتبع نظام الأسم بالكامل ليتم التعرف على النوع كما ذكرنا مسبقاً كمثال على ذلكً System.IO.File .
الأنواع الأساسية والواجهات Base Types and Interfaces
يمكن للأنواع أن ترث القيم والسلوك من نوع آخر. نواع النظام المشتركة Common Type System (CTS) لا يسمح للأنواع أن ترث من أكثر من نوع أساسي واحد.
يمكن للأنواع أن تقوم بتطبّق أيّ عدد من الواجهات. لتطبيق واجهه Interfaces ويجب تطبيق جيمع الأعضاء الإفتراضية Virtual Method ضمن النوع المعرفه من قبل الواجهه Interfaces.
نوع الأعضاء Type Members
إنّ السلوك وحالة النوع معرّف من قبل أعضاء النوع من : الأحداث Events و الحقول Fields و الأنواع المتراكبه Nested Types و الطرق Methods والخصائص Properties.

موعدنا إن شاء الله في الدروس القادمة أتمنى لكم التوفيق

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (7,6)


بعون الله نبدأ الدرس السادس من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

عملية التنفيذ المدارة - Managed Execution Process
تتضمن عملية التنفيذ المدارة Managed Execution Process الخطوات التالية:
• اختيار المترجم - Choosing a Compiler
لكي تحصل على الفوائد المزودة في إستدعاءات وقت تشغيل اللغة المشترك Common Language Runtime (CLR)، يجب عليك أن تستعمل واحد أو أكثر من مجمعات Compilers اللغة التي تستهدف وقت التشغيل Runtime، مثل مجمعات فيجول بيسك Visual Basic، C# أو كما تلفظ سي شارب C Sharp، فيجول سي ++ Visual C++، جي سكريبت JScript، أو العديد من مجمعات الفريق الثالث مثل إيفل Eiffel، بيرل Perl، أو كوبل COBOL.
لأن بيئة التنفيذ المتعددة اللغات، تدعم وقت التشغيل Runtime بتنوع عريض من أنواع البيانات وميزات اللغة. مجمع اللغة Compiler الذي استخدمته في تصميمك يحدد أي ميزات وقت التشغيل متوفرة وأنت تصمم شيفرتك و تستعمل تلك الميزات. مجمعك Your Compiler، لا يتواجد في وقت التشغيل Runtime، هو يؤسس فقط عبارات Syntax شيفرتك التي يجب أن تستخدم. إذا تطبيقك يجب أن يكون صالح للاستعمال بالكامل بمكونات كتبت في لغات أخرى، أنواعك المصدرة المكونة يجب أن تعرض مواصفات وميزات تلك الأنواع المتضمنة في تطبيقك للغتك أما الأنواع المعرفة مسبقاً في مواصفات اللغة المشتركة Common Language Specification (CLS) فهي ليست بحاجة لتعريف.

• الترجمة إلى لغة مايكروسوفت الوسيطة - Compiling to Microsoft intermediate language

وأطلق عليها أيضاً اسم الشيفرة المدارة Management Code. تتلخص هذه التقنية بما يلي:

عندما يقوم المجمع Compiler بترجمة شيفرتك المدارة، يقوم المجمع Compiler بترجمة الأوامر التي قمت بكتابتها إلى لغة وسيطة MSIL التي هي مجموعة أوامر مستقلة عن أوامر المعالج الأصلية التي يمكن أن تحول بشكل كفؤ إلى رموز المعالج الأصلية. تتضمن لغة MSIL أوامر لتحميل وتخزين و تهيئة واستدعاءات لوظائف الكائنات، وأيضا أوامر للعمليات الحسابية والمنطقية وجريان التحكم و وصول مباشر إلى الذاكرة و معالجة الاستثناءات وعمليات أخرى. قبل أن يكون الكود جاهز للعمل يجب على MSIL أن تحوله إلى لغة المعالج الأصلية، وأصبح هذا النوع من الترجمة مصطلح أطلق عليه الترجمة في الوقت المناسب أو الترجمة في زمن التشغيل just-in-time (JIT) Compile لأن الأوامر التي نقوم بكتابتها تحتوي على إستدعاءات وقت تشغيل اللغة المشترك Common Language Runtime (CLR) وهذه الأوامر تختلف كما ذكرنا سابقاً من معالج لآخر ومن نظام لأخر، ويأتي هنا دور اللغة الوسيطة لترجمة نفس الأوامر التي قمت بكتابتها إلى أوامر تفهمها معمارية النظام المضيف لهذا التطبيق التي تدعمها اللغة الوسيطة MSIL.
عند ترجمة التطبيق ينتج لغة وسيطة MSIL وتنتج أيضاً معلومات Metadata، وهذه المعلومات هي عبارة عن توصيف للأنواع التي قمت باستخدامها في الشيفرة وتتضمن تعريف دقيق لكل نوع مستخدم وتوقيع لجميع أعضاء (وظائف) النوع والأعضاء (الوظائف) هي عبارة عن إشارة للشيفرة التي قمت بكتابتها أو استدعائها ولبعض الأوامر التي تحتاج للترجمة في وقت التنفيذ. اللغة الوسيطة MSIL و معلومات الأنواع Metadata تخزن داخل ملفات ثنائية يطلق على هذه الملفات اسم الملفات التنفيذية القابلة لنقل Portable Executable (PE) File وهذه النوعية من الملفات مستندة على التقنية PE و على تقنية صيغة ملفات الكائنات العامة Common Object File Format (COFF) التي استخدمت سابقاً. وهذا النوع من صيغ الملفات يلائم MSIL & Metadata مما يمكن نظام التشغيل التعرف على أماكن تواجدها وقت التشغيل اللغة المشترك Common Language Runtime (CLR).
• ترجمة اللغة الوسيطة إلى اللغة الأصلية - Compiling MSIL to Native Code
قبل أن تكون قادر على تشغيل تطبيقك المكتوب بلغة مايكروسوفت الوسيطة Microsoft Intermediate Language يجب أن يحول الكود المكتوب في داخله إلى الأوامر الأصلية Native Code، التي يمكن لوحدة المعالجة المركزية أن تفهم هذه الأوامر وتشغيلها برغم اختلاف الهندسة المعمارية لهذا الحاسب وهذا التحويل يتم من قبل مكاتب اللغة لترجمة في الوقت المناسب .NET Framework just-in-time (JIT) Compiler لأن وقت التشغيل اللغة المشترك Common Language Runtime (CLR) مجهزه بترجمة في وقت التشغيل just-in-time (JIT) compiler ولكل معمارية وحدة معالجة مركزية يوجد لها (JIT) مدعومة، يمكن للمطورين أن يكتبوا مجموعة MSIL التي يمكن أن تصبح مجموعة من الأوامر التي تترجم في وقت التشغيل (JIT) compiler وتستطيع العمل على الحواسب ذات الهندسة المعمارية المختلفة. من جهة أخرى يجب أن نفهم مايلي، تطبيقك الذي يحتوي على الشيفرة المدارة Management Code سيعمل فقط على نظام تشغيل محدد إذا قمت باستدعاء أوامر هذا النظام Platform-Specific Native APIs لأنه كما ذكر سابقاً بأن معمارية أنظمة التشغيل تختلف من نظام لآخر، أو إذا قمنا باستدعاء مكتبة أنواع محددة Platform-Specific Class Library.

التقنية الحديثة التي تتحدث عنها الترجمة في وقت التنفيذ just-in-time (JIT) compiler لو فكرنا فيها قليلاً لوجدنا أنها سوف تقوم على إبطاء التطبيقات التي تستخدم هذه التقنية فقامت شركة مايكروسوفت على تطوير هذه التقنية فمقاطع الكود التي تقوم في ترجمتها على الأوامر الأصلية التي تفهمها الهندسة المعمارية المضيفة لتطبيقك أثناء التشغيل فبدلاً من حذفها عند الانتهاء منها تقوم بتخزينها في ذاكرة الحاسب لتكون جاهزة للطلب في المرة القادمة. ينشئ محمل Loader التطبيق جدول ويقوم بتخزين عناوين لمواقع المقاطع التي قام بترجمتها أو لمناهج أحد الكائنات ليقوم بربط كل استدعاء أو حين تنشئ كائن جديد في شيفرتك من كائن قد ترجمة مناهجه مسبقاً .كما قلنا مسبقاً فإن الاستدعاء الأول لهذه المناهج يجب أن يترجم عن طريق المترجم أو الترجمة أثناء التشغيل just-in-time (JIT) compiler، الذي يقوم عل تحويل MSIL لذلك المنهج إلى اللغة الأصلية Native Code ويقوم بتعديل عنوان هذا المنهج إلى عنوان المنهج الذي قام المترجم بتحويله. والاستدعاءات المقبلة لهذا المنهج أو لهذا المقطع من الشيفرة لن يمر عبر الترجمة الفورية للشيفرة just-in-time (JIT) compiler مما يساعد في تخفيض الوقت لاستدعاء هذه الشيفرة مما يؤدي لتخفيض من أهمية العقبة التي وقفت في وجهة هذه التقنية.
يزود وقت التشغيل Runtime نمط آخر من أنماط التجميع Compilation يطلق عليه الترجمة في وقت التركب للشيفرة Install-Time code generation.تحول اللغة الوسيطة MSIL في نمط الترجمة في وقت التركب للشيفرة Install-Time code generation إلى الشيفرة الأصلية Native Code كما يعمل المجمع النظامي للترجمة في وقت التشغيل (JIT) compiler، لكنه يحول وحدات أكبر من الشيفرة في نفس الوقت،ويخزن الشيفرة الأصلية Native Code الناتجة في مجمعات Assemblies وتكون جاهزة للاستعمال عند تحميل وتنفيذ التجمع Assembly بعد ذلك. عندما نستخدم نمط الترجمة في وقت التركب للشيفرة Install-Time code generation، كل التجمع Assemblies الذي يركب يحول إلى الشيفرة الأصلية Native Code، يأخذ في الحسبان تجميع معرفة حول التجمعات Assemblies الأخرى التي ركبت مسبقاً. تحميل ملفات النتيجة في هذا النمط يجعله يعمل بشكل أسرع من اختيارنا لنمط الترجمة أثناء التشغيل just-in-time (JIT) compiler.

• تشغيل الشيفرة – Running Code

يزود وقت تشغيل اللغة المشترك Common Language Runtime (CLR) البنية التحتيه التي تمكن التنفيذ المدار Managed Execution أن يحدث ومجموعة متنوعة أيضا من الخدمات التي يمكن أن تستعمل خلال التنفيذ. قبل أن تكون قادر على تنفيذ الشيفرة، يجب أن تقوم بترجمتها إلى لغة المعالج المحدد. كل طريقة في لغة مايكروسوفت الوسيطة Microsoft intermediate language (MSIL) يجب على المجمع تحويله إلى اللغة الأصلية Native Code فقط في الترجمة أثناء وقت التشغيل just-in-time (JIT) compiler وعندما تطلب أول مرة، و في المرات القادمة لا يقوم المجمع بعملية التحول ثانية بل تطلب من المنطقة التي خزنت فيها كما تحدثنا مسبقاً. ويبقى المجمع يطلب عملية الترجمة أثناء التشغيل just-in-time (JIT) compiler للشيفرة المدارة حتى يتم الانتهاء من تنفيذ جميع هذه الشيفرة أو يتم توقف عمل التطبيق0
خلال التنفيذ، الشيفرة المدارة تستلم خدمات مثل مجمع النفايات Garbage Collection، أمن Security، إمكانية لوجود شيفره غير مداره Interoperability With Unmanaged Code، دعم تنقيح الشيفرة Debugging، تحسين لتوزيع ودعم لنقل الشيفرة والتطبيقات Deployment and Versioning .
في مايكروسوفت ويندوز إكس بي Windows XP، محمل نظام التشغيل يتأكد من الوحدات المدارة Managed Modules باختبار إحدى قيم أجزاء Bits الترويسه لملفات المكتوبة في صيغة ملفات الكائنات المشتركه Common Object File Format (COFF). يشير هذا المكان (Bit) إلى أن محتويات هذا الملف وحدة مدارة Managed Modules أم لا. إذا تأكد محمل النظام من أن الملف يحوي وحدات مدارة Managed Modules، يقوم بتحميل MSCORE.DLL وهي أحد المكاتب المسئولة عن ترجمة الشيفرة المدارة Managed Code ويقوم استدعاء الوظيفتين _CorValidateImage and _CorImageUnloading وهما أحد أعضاء هذه المكتبة ومهمة هاتين الوظيفتين إبلاغ محمل النظام عند تحميل Loaded وإلغاء تحميل Unloaded الوحدات المدارة. تنجز الوظيفة التي يقوم المحمل باستدعائها _CorValidateImage المهام التالية:
1- يضمن بأن الشيفرة هي شيفرة مداره Managed Code صحيحة.
2- يقوم بتغير نقطة الدخول في الصورة (الشيفرة المدارة Managed Code) إلى نقطة دخول في وقت التشغيل.
في نظام التشغيل ويندوز 64 Windows 64، تقوم الوظيفة _CorValidateImage بتعديل الصورة التي في الذاكرة بتحويلها من صيغة ملفات PE 32 إلى صيغة ملفاتPE32+ .
بعون الله نبدأ الدرس السابع من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

الإدارة الآلية للذاكرة - Automatic Memory Management
الإدارة الآلية للذاكرة Automatic Memory Management هي من أحد الخدمات التي يقوم وقت التشغيل اللغة المشترك Common Language Runtime (CLR) بتزويدها خلال عملية التنفيذ المدارة Managed Execution Process . جامع النفايات Garbage Collector التابع لوقت تشغيل اللغة المشترك Common Language Runtime (CLR) يقوم بإدارة جميع الحجوزات والتقسيمات التي أنشأتها التطبيقات في الذاكرة ليقوم على تحريره حين تنتهي التطبيقات من استخدامها. وتعني الإدارة الآلية للذاكرة Memory Management للمطور الذي اعتاد على كتابة شيفرة ليقوم بعملية إدارة الذاكرة. وكان هذا العمل شاق جداً وكان المبرمج بدلاً من أن يحل المشكلة التي جاء بها يفاجئ بمشاكل إدارة الذاكرة وإدارة الذاكرة Memory Management تعني أنه يجب على المطور أن يقوم بحذف جميع المصادر التي قام باستخدامها لكي لا يسبب بعملية هدر لا متوقع في الذاكرة أو كما يقال إنشاء ثقب أو تسريب في الذاكرة Memory Leaks أو الكتابة على مناطق في الذاكرة قمت على تحريرها مسبقاً فجاءت تقنية الإدارة الآلية الذاكرة Automatic Memory Management لتريح المطور من هذه المشاكل كلها وفي مايلي شرح لمبادئ عمل جامع النفاياتGarbage Collector من إدارة وتحرير:
• تقسيم الذاكرة - Allocating Memory
عندما تبدأ في عملية جديدة، يحجز وقت التشغيل Runtime منطقة متجاورة Contiguously من فضاء عناوينAddress Space العملية. طريقة حجز العناوين الجديدة New Address في فضاء عنوان Address Space العملية يدعو الكومة المدارة Managed Heap. تحتفظ الكومة المدارة Managed Heap بمؤشر Pointer إلى العنوان المتاح أي العنوان الذي لم يتم حجزه من قبل أي كائن حيث سيتم تخصيص مكان للكائن Object القادم في الكومة Heap ويطلق على هذا العنوان العنوان الأساسي Base Address. بشكل مبدئي، هذا المؤشر هو عبارة عن عنوان رئيسي Base Address للكائن Object وهو أحدا لعناوين المتواجدة في الكومة المدارة Managed Heap. نستنتج مما يلي أن أي كائن Object نستطيع التعامل معه عن طريق العنوان Pointer نستطيع أن نخصص له مكان في الكومة المدارة Managed Heap وهذه الكائنات Objects هي عبارة عن أنواع New Types جديدة نطلق عليها الأنواع ذات المرجع Reference Types. عندما ينشئ أي تطبيق أول كائن من نوع ذا مرجع Reference Types، يأخذ هذا العنوان أول عنوان Pointer متاح وهو عنوان القاعدةBase Address في الكومة المدارة Managed Heap. عندما ينشئ التطبيق كائن Object جديد،يقوم جامع النفايات بشكل فوري بتخصيص ذاكره لهذا الكائن Object في فضاء العنوان Address Space ويكون بعد عنوان Pointer الكائن الأول First Object. طالما يوجد مكان متوفر في فضاء العناوين Address Space، يستمر جامع النفايات Garbage Collector بتخصص فضاء Space للكائنات الجديدة New Object في هذا الأسلوب الذي تحدثنا عنه.

تخصيص الذاكرة في الكومة المدارة Managed Heap أسرع من تخصيص الذاكرة الغير مدار Unmanaged Memory Allocation. لأن وقت التشغيل Runtime يخصص ذاكرة للكائن Object بإضافة مؤشر Pointer جديد إلى المؤشرات Pointers الموجودة، وهذه الطريقة على الأغلب أسرع من تخصيص الذاكرة في المكدس Stack. بالإضافة أن الكائنات Objects الجديدة التي تحجز مؤشراتها Pointers بشكل متتالي Contiguously تخزن بشكل متتالي أيضاَ في الكومة المدارة Managed Heap، يمكن للتطبيق أن يستدعي الكائنات Objects في هذه الحالة بشكل سريع جداً.

• تحرير الذاكرة - Releasing Memory

يحسن محرك تحديد الوقت مهمة جامع النفايات Garbage Collector ليقوم بأفضل أداء فهو يقوم باختيار الوقت المناسب ليقوم بعملية جمع وتحرير الذاكرة الغير مستخدمة. عندما يقوم جامع النفايات Garbage Collector بإنجاز مهمة جمع النفايات، فهو يقوم بتحرير جميع مناطق الذاكرة التي لم تعد مستخدمة من قبل التطبيق. يستطيع جامع النفايات Garbage Collector تحديد الكائنات Objects الغير مستخدمة عن طريق اختبار جداول مؤشرات Root التطبيق. وجميع التطبيقات تملك مجموعة من جداول المؤشرات Roots. كل جدول للمؤشرات Root أما يشير إلى مجموعة من الكائنات Objects في الكومة المدارة Managed Heap أو مجموعة من الكائنات Objects الغير مستخدمة. جداول مؤشرات Roots التطبيق تتضمن مؤشرات Pointers لكائنات Objects عامة Public وساكنة Static ومتحولات محلية Local Variables ومرجع لكائنات Reference Objects تكون عبارة عن بارامترات Parameters في مكدس Stack وسجلات وحدة المعالجة المركزية CPU Registers. جامع النفاياتGarbage Collector يملك أمكانية الوصول إلى قائمة جداول المؤشرات List Roots النشطة التي تكون قيد الاستخدام من قبل الترجمة في الوقت المناسب just-in-time (JIT) compiler ووقت التشغيل Runtime يحتفظان بها. جامع النفايات Garbage Collector يقوم باستخدام هذه القائمة List Roots ليقوم بعملية اختبار لجداول مؤشرات Roots التطبيق ويقوم بإنشاء مخطط بياني Graph للعملية التي تحتوي جميع الكائنات Objects التي تكون قابلة للوصول من قبل جداول المؤشرات Roots.
بعد أن ينته جامع النفايات Garbage Collector من تشكيل المخطط البياني Graph يقوم بعملية اختبار لهذا البيان Graph فيقوم بعملية تحديد للكائنات Objects التي تحتل مكان في الكومة المدارة Managed Heap ولكن هذه الكائنات Objects غير مستخدمة من قبل التطبيق ,يعتبر جامع النفايات Garbage Collector أن جميع الكائنات Objects التي لا تستخدم من قبل التطبيق بأنها كائنات ملغية Null Objects فيقوم باستخدام أحد وظائف الكائن المستخدم التي تقوم بنسخ جميع محتويات الذاكرة المتعلقة بهذا الكائن Memory-Copying Function لتنسخ أماكن الكائنات Objects الغير مستخدمة ويقوم بعملية تعديل لمؤشرات Pointers هذه الكائنات Objects في جدول مؤشرات التطبيق للمؤشرات الجديدة وبعد هذه العملية يقوم بتحرير الذاكرة التي خصصت لهذه الكائنات Objects. ومن ثم يضع مؤشر الكومة المدارة Managed Heap بعد الكائن Object الأخير القابل للوصول. ويطلق على هذه العملية عملية ضغط الذاكرة Memory Compaction وهذه العملية تعمل فقط إذا اكتشف جامع النفايات Garbage Collector بأن هناك عدد ملحوظ من الكائنات Objects الغير مستخدمة. فهذا يعني إذا كانت جميع الكائنات Objects الموجودة في الكومة المدارة Managed Heap مستخدمة فليست هناك حاجة لعملية ضغط الذاكرة Memory Compaction.

لتحسن الأداء، يخصص وقت التشغيل Runtime ذاكرة للكائنات Objects الكبيرة في كومات منفصلة Separate Heap. يحرر جامع النفايات Garbage Collector الذاكرة آليا للكائنات Objects الكبيرة. على أية حال، لتجنب عملية نسخ الكائنات Objects الكبيرة يجب على هذه الذاكرة أن لا تقوم باستدعاء جامع النفايات Garbage Collector كثيراً .

• مرحلة التوليد و الأداء - Generations and Performance

لتحسين أداء جامع النفايات Garbage Collector، تقسم الكومة المدارة Managed Heap في ثلاثة مراحل للتوليد: 0، 1, 2. إن خوارزمية Algorithm جامع نفايات Garbage Collector وقت التشغيل Runtime مستندة على بضعة تعميمات بُنية عليها صناعة تطبيقات الحاسب وقد اكتشف من قِبل التجريب أنه يمكن لهذه الخوارزميات Algorithm أن تعمل مع مخططات مجموعة النفايات Garbage Collector وهي:
أولاً: إن ضغط Compaction أقسام من الذاكرة لقسم الكومة المدارة Managed Heap أسرع من ضغط Compaction جميع الكومة المدارة Managed Heap.
ثانيا: الكائنات Objects الأحدث ستملك عمر Lifetimes أقصر والكائنات Objects الأقدم ستملك عمر Lifetimes أطول. وأخيراً، الكائنات Objects الأحدث تميل لأن يتعلق كلاهما بالآخر وتحاول وصول التطبيق إليهم بنفس الوقت.

يخزن جامع نفايات Garbage Collector وقت التشغيل Runtime الكائنات Objects الجديدة في مرحلة التوليد 0. الكائنات Objects التي أنشئت في وقت عمل التطبيق التي تبقى في مجموعات فهي قد تم ترقيتها وتخزينها في مرحلة التوليد 1 و 2. (عملية ترقية الكائن Objects ستشرح لاحقاً في هذه الفقرة). لأن عملية ضغط Compaction قسم من الكومة المدارة Managed Heap أسرع من ضغط Compaction كل الكومة Heap، هذا المخطط يسمح لجامع النفايات Garbage Collector أن يحرر الذاكرة في مرحلة توليد محدده بدلاً من تحرير الذاكرة لكل الكومة المدارة Managed Heap كل وقت تنجز فيه عملية جمع النفايات Garbage Collect.

في الواقع، ينجز جامع النفايات Garbage Collector عملية التجميع عندما تنتهي مرحلة التوليد 0 بالكامل. إذا حاول التطبيق إنشاء كائن Object عندما تنتهي مرحلة التوليد0 بالكامل، يكتشف جامع النفايات Garbage Collector بأنه لم يعد هناك مكان في فضاء العناوين Address Space في مرحلة التوليد 0 التي سوف تخصص للكائن Object الجديد الذي يحاول التطبيق إنشائه. ينجز جامع النفايات Garbage Collector عملية جمع النفايات Garbage Collect في محاولة لتحرير فضاء عنوان Address Space للكائن Object الجديد في مرحلة التوليد 0. يبدأ جامع النفايات Garbage Collector باختبار الكائنات Objects في مرحلة التوليد 0 بدلا من اختبار كل الكائنات Objects في الكومة المدارة Managed Heap. هذا الطريقة أكثر كفاءة، لأن الكائنات Objects الجديدة تميل إلى امتلاك عمر قصير، وهي تتوقع بأن العديد من الكائنات Objects التي أنشئت في مرحلة التوليد 0 لن تكون قيد الاستعمال بالتطبيق عندما تبدأ عملية تجميع النفايات Garbage Collect. بالإضافة، مجموعة مرحلة التوليد 0 هي الوحيدة غالباً التي تسترد قدراً كاف من الذاكرة لكي تسمح للتطبيق بالاستمرار بإنشاء كائنات Objects جديدة.

بعد أن ينهي جامع النفايات Garbage Collector مجموعة مرحلة التوليد 0, يقوم بضغط الذاكرة Memory Compaction للكائنات القابلة للوصول كما وضحت في الفقرة السابقة تحرير الذاكرة - Releasing Memory في هذا الموضوع. جامع النفايات Garbage Collector إذن يرقي هذه الكائنات Objects ويعتبر هذا القسم من الكومة المدار Managed Heap بمرحلة مرحلة التوليد 1. لأن الكائنات Objects التي تبقى في مجموعات تميل لأن تملك مدة بقاء أطول، و من المعقول أن ترقى هذه الكائنات Objects إلى مرحلة توليد أعلى. نتيجة لذلك، ليس من مهام جامع النفايات Garbage Collector أن يعيد اختبار هذه الكائنات Objects في مرحلة التوليد 1و 2 في كل وقت ينجز فيها مجموعة مرحلة التوليد 0.
بعد أن ينجز جامع النفايات Garbage Collector مجموعته الأولى للتوليد 0 ويرقي الكائنات Objects القابلة للوصول إلى مرحلة التوليد 1, يعتبر بقية الكومة المدار Managed Heap لمرحلة التوليد 0. يستمر بتخصيص ذاكرة للكائنات Objects الجديدة في مرحلة التوليد 0 حتى تمتلئ مرحلة التوليد 0 وقد أصبح هنا من الضروري أن ينجز مجموعة أخرى. على هذه النقطة، جامع النفايات Garbage Collector يحسن إلى أبعد قدر ممكن محرك التحديد سواء أكان من الضرورة أن تختبر الكائنات Objects في مراحل التوليد الأقدم أم لا. على سبيل المثال، إذا لم تتمكن مجموعة مرحلة التوليد 0 أن تسترد ذاكرة كافية للتطبيق لكي تكمل محاولتها بإنشاء كائن Object جديد بنجاح ، جامع النفايات Garbage Collector يمكن أن ينجز مجموعة مرحلة التوليد 1, بدل من مرحلة التوليد 0. وإذا كانت هذه المرحلة لا تسترد ذاكرة كافية أيضاً، يمكن لجامع النفايات Garbage Collector أن ينجز مجموعة مرحلة التوليد الأخرى وهكذا يستطيع أن ينجز أي من مجموعات مراحل التوليد 0, 1, 2. بعد كل مجموعة، جامع النفاياتGarbage Collector يضغط الكائنات Objects القابلة للوصول في مرحلة التوليد 0 وترقيهم إلى مرحلة التوليد 1. الكائنات Objects في مرحلة التوليد 1 التي تعيش في مجموعات ترقي إلى مرحلة التوليد 2. لأن جامع النفاياتGarbage Collector يدعم فقط ثلاثة مراحل توليد، الكائنات Objects في مرحلة التوليد 2 التي تعيش في مجموعات تبقى في مرحلة التوليد 2 حتى تصمم هذه المجموعات في المستقبل أن تكون مجموعة غير مستخدمة.

تحرير الذاكرة للمصادر الغير مدارة - Releasing Memory for Unmanaged Resources

إن أغلبية الكائنات Objects التي ينشئها تطبيقك يمكنك أن تعتمد على جامع النفايات Garbage Collector ليؤدي مهمة إدارة الذاكرة الضرورية آليا. على أية حال، المصادر الغير مدارة Unmanaged Resources تتطلب من تطبيقك تنظيف واضح لهذه المصادر. إن الأنواع الأكثر شيوعاً من المصدر الغير مدار Unmanaged Resources هي الكائنات Objects التي تكون أحد المصادر التي تقدمها أنظمة التشغيل، مثل مقابض الملفات File Handle، مقابض النوافذ Window Handle، أو ارتباط الشبكات Network Connection. وبرغم من أن جامع النفايات Garbage Collector قادر أن يتعقب عمر الكائنات المدارة Managed Objects التي غلفت المصدر الغير مداره Unmanaged Resources، ولكن ليس لجامع النفايات Garbage Collector أية معرفة عن كيفية تنظيف المصادر الغير مدارة Unmanaged Resources . عندما تنشأ كائن Object يغلف مصدر غير مدار Unmanaged Resources، يوصى جامع النفايات Garbage Collector بأن تزوده بشيفرة كي تقوم بعملية النظيف للمصادر الغير مدارة Unmanaged Resources ويوصي أيضاً بأن تضع هذه الشيفرة في وظيفة تطلق عليها اسم Dispose. بتزويد الكائن Object هذه الوظيفة، سيتمكن المستخدمين لكائنك Object أن يحرروا المصادر التي قام كائنك Object باستخدامها بشكل واضح عندما ينتهون من استخدام كائنك Object. عندما تستخدم كائن Object يغلف مصادر غير مداره Unmanaged Resources، أنت يجب أن تكون مدرك للوظيفة التي تقوم بتنظيف المصادر الغير مدارة Unmanaged Resources ويجب أن تكن مدرك أنك يجب أن تستدعي هذه الوظيفة التي أوصى جامع النفايات Garbage Collector بان تطلق عليها الاسم Dispose عند الضرورة. للمزيد من المعلومات حول تنظيف المصادر الغير مدار أنظر الفصل جامع النفايات Garbage Collector.

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (5,4)

بعون الله نبدأ الدرس الرابع من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

تطوير تطبيقات العميل - Client Application Development
تطبيقات العميل Client Application هي عبارة عن تطبيقات ذات نماذج تقليدية معتمدة على شكل النظام الذي تآلف معه المستخدم فالتطبيقات التي تعتمد على النظام ويندوز Windows-Based Programming تتألف من ما قد اعتاد علية المستخدم من نوافذ Windows ونماذج Forms تقليدية تساعد المستخدم في إتمام مهمته التي انشأ التطبيق من أجلها. كمثال على تطبيقات العميل Client Application تطبيقات معالجة الكلمات Word Processors والجداول الإلكترونية Spreadsheets ومثل تطبيقات اختصاصيه لمشاكل عمل خاصة مثل تطبيقات إدخال البيانات والتقارير وغير ذلك من تطبيقات اعتددنا على العمل معها. وتعتمد هذه التطبيقات أيضاً على جميع الأدوات التي اعتدنا على التعامل معها مثل شريط القوائم Menus وأزرار الأوامر Command Buttons و أشرطة التمرير Scroll Bar وغير ذلك من أدوات ومن المحتمل لهذه التطبيقات أن تتعامل مع المصادر المحلية Local Resources مثل نظام الملفات File System أو تتعامل مع المحيط الخارجي Peripherals مثل الطابعات Printers والراسمات Plotter والماسحات الضوئية Scanner وغير ذلك من أمور.
الأنواع الأخرى من تطبيقات العميل Client Application هي أدوات التطوير التقليدية Traditional ActiveX Control (استبدلت حالياً بأدوات نماذج الويندوز المدارة Managed Windows Forms Control) وهي كالتطبيقات التي تحدثنا عنها تستطيع أن نتعامل معها إما عن طريق نماذج الويندوز Windows Forms أو نماذج الوب Web Form وتستطيع أن تتعامل مع المصادر المحلية Local Resources ويمكن أن تتعامل مع المحيط الخارجي Peripherals ويمكن أن تضم أيضاً عناصر مرئية Graphical Elements وتنفذ هذه الأدوات بشكل محلي أيضاً.
في الماضي كان المبرمجين يطورون هذه الأدوات عن طريق لغات C/C++ بالارتباط مع أصناف ويندوز الأساسية Microsoft Foundation Classes (MFC) أو باستخدامه بيئات التطوير السريعةRapid Application Development (RAD) مثل لغة الفيجول بيسك لمايكروسوفت Microsoft Visual Basic. أما في مكتبة التطوير .NET Framework تدمج كلتا الميزتين في كلا البيئتين السابقتين في بيئة تطوير واحدة التي تبسط بشدة تطوير برامج العميل Client Application.
أصناف نماذج ويندوز Windows Forms Classes متضمنة داخل مكتبة التطوير .NET Framework مصممة لتستخدم في تطوير برامج الوجهات الرسومية Windows GUI Applications. تستطيع إنشاء نماذج مثل أزرار الأوامر Command Buttons والقوائم Menus وأشرطة الأدوات Toolbars وعناصر أخرى تحتاج لأن تكون مرنة الاستخدام لتتلاءم مع حاجة التطبيقات.
على سبيل المثال مكتبة التطوير .NET Framework مزودة بخصائص سهلة لضبط الميزات المرئية Visual Attributes المتعلقة بالنماذج. في بعض الحالات نظام التشغيل Operating System لا يدعم تغير مثل هذه الميزات بشكل مباشر في مثل هذه الحالات يقوم مكتبة التطوير .NET Framework ألياً بإعادة إنشاء النماذج بالشكل المطلوب. هذه أحد الميزات التي تتمتع بها مكتبة التطوير .NET Framework لتتوحد مع مطورا الشاشات لتجعل من الشيفرة أسهل وأكثر توافقية.
بعكس أدوات التطوير ActiveX Control، نماذج الويندوز Windows Forms تمتلك نصف الثقة للوصول إلى المصادر المحلية Local Resources لنظام المستخدم. هذا يعني أن التنفيذ الثنائي أو التنفيذ الأصلي للشيفرة يستطيع الوصول إلى بعض المصادر المحلية Local Resources في أنظمة المستخدم (مثل الناصر المرئية للوصول المحدود للملفات GUI Elements And Limited File Access) وبدون أن يكون قادر على الوصول أو التفاوض مع المصادر الأخرى Other Resources. وذلك بسبب أمن الوصول المفروض على الشيفرة Code Access Security. العديد من التطبيقات التي تحتاج لتركبها على نظامك لقد أصبح الآن أمن تركيب مثل هذه التطبيقات حتى لو كان من خلال صفحات الوب Web Pages. يمكن أن تنجز تطبيقاتك ميزات تطبيق محلي بينما تنشر بطرق مختلفة مثل صفحات الوب Web Pages.

تطوير تطبيقات المزود - Server Application Development

تطبيقات جانب المزود Server-Side Applications في عالم التطبيقات المدار Managed World's Applications ينجز من خلال مضيف وقت التشغيل Runtime Hosts. تطبيقات غير مدارة Unmanaged Applications تستضيف وقت تشغيل اللغة العام Common Language Runtime التي تسمح لشيفرتك المدارة Managed Code أن تتحكم في تصرف المزود Server. هذا النموذج يزودك بكل ميزات وقت تشغيل اللغة العام ومكتبة الصنف بينما كسب الأداء وقابلية النمو من المزود المضيف.
الإيضاح التالي سيريك مخطط شبكة أساسية مع الشيفرة المدارة التي تعمل في بيئات المزود المختلفة مثل مزود IIS ومزود SQL يمكن أن ينجز عمليات قياسية بينما منطق تطبيقك ينفذ من خلال الشيفرة المدارة.





ASP.NET هو بيئة لاستضافة التطبيقات لتمكن المطورون من استخدام مكاتب التطوير .NET Framework التي تستهدف تقنية الوب قاعدةWeb-Based لتطبيقاتهم. ASP.NET هو أكثر من أن يكون بيئة لاستضافة التطبيقات فقط، بل هو هندسة معمارية متكاملة معدة لتطوير مواقع الوب Web Site وكائنات شبكة الإنترنت الموزعة Internet-Distributed Objects مستخدمة الشيفرة المدارة Managed Code. نماذج الوب Web Forms و XML لخدمات الويب XML Web Services كلاهما يستخدم مزود معلومات شبكة الإنترنت IIS و مزود الصفحات النشطة ASP.NET كآلية نشر للتطبيقات، وكلاهما يملك مجموعة من الأصناف تدعم مكاتب التطوير .NET Framework .
XML لخدمات الويب XML Web Services أهم تطوير في تقنية التطبيقات المعتمدة على الوبWeb-Based وهي موزعة،التطبيقات التي تعمل في جانب Server-Side Applications المزود تشبه مكونات مواقع الوب Web Site، على أية حال، بعكس التطبيقات المعتمدة على الوبWeb-Based ، XML لخدمات الويب XML Web Services هي مكونات لا تملك واجهة مستخدم User Interface UI وليس هدفها المستعرض مثل مستعرض شبكة الإنترنت Internet Explorer أو مستكشف نتسكيب Netscape Navigator، عوضاً عن ذلك، XML لخدمات الويب XML Web Services يضم مكونات لبرامج قابلة لإعادة الاستخدام ومصممة لتستخدم من قبل تطبيقات أخرى، مثل تطبيقات العميل التقليدية Traditional Client Applications، والتطبيقات المعتمدة على الوبWeb-Based ، أو حتى XML لخدمات الويب XML Web Services. ويمكن أن تستخدمها هذه التطبيقات كنتائج Result أو كرد Response على بعض الطلبات Request، تقنية XML لخدمات الويب XML Web Services تحرك تطوير التطبيقات بشكل سريع وانتشار في البيئة الموزعة من شبكة الإنترنت Distributed Environment Of The Internet إلى حد كبير.
إذا كنت قد استخدمت إصدارات سابقة من تقنية صفحات المزود النشطة ASP، ستلاحظ مباشرة التحسينات التي طرأت على الإصدار الجديد من صفحات المزود النشطة ASP.NET و نماذج الوب Web Forms. تستطيع أن تقوم بتطوير صفحات نماذج الوب Web Forms Pages في أي لغة تدعم مكاتب التطوير .NET Framework . بالإضافة أنك لم تعد بحاجة لتشارك شيفرتك مع نفس الملف الذي يحتوي على نصوص الـ HTTP (ولو أنه قابل للعمل إذا كنت تفضل ذلك أو مازلت ترقي معلوماتك وبرامجك من إصدارات سابقة). تنفذ صفحات نماذج الوب Web Forms Pages في لغة الآلة الأصلية Native Machine Language لأنه مثل أي تطبيق مدار Managed Application آخر، وهذه الصفحات ستأخذ جميع فوائد وقت التشغيل Runtime. على النقيض، الإصدارات السابقة من صفحات المزود النشطة أو الغير Unmanaged ASP مدارة هي دائماً عبارة عن نصوص سكريبت Scripted وتفسر حين الطلب. أما الإصدار الحديث من صفحات المزود النشطة ASP.NET تكون أسرع وأكثر وظائفية وأسهل للتطوير من صفحات المزود النشطة الغير مدارة Unmanaged ASP لأنه تتفاعل مع وقت التشغيل Runtime مثل أي تطبيق مدار Managed Application.
تزود مكاتب التطوير .NET Framework أيضاً بمجموعة من الأصناف Classes والأدوات Tools التي تساعد في تطوير واستهلاك XML لخدمات الويب XML Web Services. تبنى XML لخدمات الويب XML Web Services على المقاييس مثل SOAP (اتفاقية مخاطبة إجرائية بعيدة A Remote Procedure-Call Protocol) XML (لغة صيغة ملفات قابلة للامتداد Extensible Data Format Language) و WSDL (لغة وصفية لخدمات الوب Web Services Description Language). مكاتب التطوير .NET Framework بنية على هذه المقاييس ليرقى ويكون قابل للعمل مع تطبيقات غير تابعة لمايكروسوفت NON-Microsoft.
على سبيل المثال أدوات لغة وصف خدمات الوب WSDL Tools متضمنة مع مجموعة مكاتب التطوير .NET Framework SDK تستطيع XML لخدمات الويب XML Web Services أن تنشر على الوب Web، وقادرة على تحليل وصف WSDL ، وتنتج شيفرة مثل سي شارب C# أو الفيجول بيسك Visual Basic الذي يمكن أن يستخدمه تطبيقك ليصبح عميل XML لخدمات الويب XML Web Services. الشيفرة تستطيع أن تنشأ أصناف Classes مشتقه من أصناف Classes موجودة في مكتبة الأصناف Classes Library التي تعالج كل متطلبات الاتصال مع SOAP و محلل XML (XML Parser). وتستطيع أن تستخدم مكتبة الأصناف Classes Library لتستهلك XML لخدمات الويب XML Web Services مباشرة، أدوات لغة وصف خدمات الوب WSDL Tools والأدوات الأخرى محتوى في SDK لتسهل جهد التطوير مع مكاتب التطوير NET Framework.
إذا كنت مطور وموزع لتطبيقات تعتمد على XML لخدمات الويب XML Web Services، مكاتب التطوير معدة لتستهلك كل متطلبات تطبيقات الاتصالات القياسية، مثل SOAP و WSDL و XML. استخدامك لتلك الأصناف Classes يجعلك تركز على منطق العمل أكثر من كيفية عمل الاتصال ومن دون أن تقلق نفسك بالبنية التحتيه للاتصالات التي يتطلبها برنامجك الذي تقوم بتطويره ليكون قابل لتوزيع.
في النهاية، صفحات نماذج الوب Web Forms Pages في البيئة المدارة Managed Environment، لتطبيقاتك المعتمدة على XML لخدمات الويب XML Web Services ستعمل بشكل سريع لأنها تنفذ بلغة الآلة الأصلية Native Machine Language وقابلة للتطوير مستخدمة معلومات خدمات الإنترنت Internet Information services IIS.

بعون الله نبدأ الدرس الخامس من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية

داخل مكاتب التطوير - Inside the .NET Framework

سيقدم هذا القسم فكرة مبدئية عن أهم ميزات مكاتب التطوير NET Framework.

وقت تشغيل اللغة المشترك - Common Language Runtime (CLR)

المجمعات Compilers والأدوات Toolsيقدمان وظائف لوقت التشغيل وتمكنك أن تكتب شيفرة تستطيع أن تستفيد منها في بيئة التنفيذ المدارة Managed Execution Environment. الشيفرة التي تكتب داخل اللغة وتكون مستهدفة لتترجم أثناء الإقلاع يطلق عليها الشيفرة المدارة Management Code، وتمكننا هذه الطريقة من الاستفادة من التوافق بين اللغات واستثناءات اللغة وزيادة في أمن الشيفرة المكتوبة و النقل و يدعمان النشر والتوزيع، تبسيط النماذج المكتوبة من أجل تفاعل المكونات مع بعضها البعض، وتنقيح الشيفرة من الأخطاء.

لتتمكن المجمعات Compilers من تزويد خدمات لشيفرتك المدارة Management Code في وقت التشغيل Runtime، يجب على هذه المجمعات Compilers أن تصدر المعلومات Metadata التي تقوم بوصف الأنواع الجديدة New Type و الأعضاء الجديدة للكائنات Members-Objects والمرجع لهذه الكائنات References-Objects التي قمت بكتابتها. تخزن المعلومات Metadata مع الشيفرة وكل تطبيق يكون قابل للتحميل أو الإقلاع يحمل بداخله وقت تشغيل اللغة المشترك Common Language Runtime (CLR) ويكون مخزن داخل الملفات التي يطلق عليها ملفات تنفيذية قابلة للنقل Portable Executable (PE) File تضم بداخلها معلومات Metadata عن هذه الشيفرة. نحتاج لهذه المعلومات Metadata أثناء تشغيل الشيفرة ليتمكن المجمع من تحديد جميع الأنواع المكتوبة وليكون قادر على تحميل هذه الأنواع في الذاكرة ويكون قادر على حل وتنفيذ شيفرتك وتحويله إلى الشيفرة الأصلية Native Code التي يستطيع المعالج أن ينفذها ويكون قادر أيضاً على وضع حدود لتطبيقك في وقت التشغيل ويجبره على تطبيق قواعد الأمان المتبعة في أنظمة التشغيل المضيفة لهذه الشيفرة.
وقت التشغيل Runtime يعالج نماذج الكائنات Objects Layout آلياً ويدير المراجع References إلى هذه الكائنات، ويقوم على تحرير المصادر التي كانت مستخدمة من قبل هذه الكائنات عندما تكون جميع المؤشرات التي تشير إلى هذه الكائنات قد دمرت إي انتهت من العمل. الكائنات التي تدار حياتها Lifetimes بهذه الطريقة تدعى البيانات المدارة Managed Data. مجمع النفايات Garbage Collection ويتمحور عمله في تحرير الذاكرة التي لم تعد مستخدمة لتكون جاهزة للاستخدام مجدداً متفادياُ وقعك في الخطأ الشائع وهو تسرب الذاكرة Memory Leaks.إذا كانت شيفرتك من النوع المدار Management Code، يمكنك في هذه الحالة أن تستخدم البيانات المدارة Managed Data، والبيانات الغير مدارة Unmanaged Data، أوكلا البيانات المدارة والغير مدارة في مكاتب التطوير .NET Framework المستخدمة في تطبيقك. لأن مجمعات Compilers اللغة يجهز أنواعهم الخاصة، مثل الأنواع الرئيسية (البدائية) Primitive Types، لا يمكنك أن تعرف دائما (أو لست بحاجة لأن تعرف) متى بياناتك ستدار.
وقت تشغيل اللغة المشترك Common Language Runtime (CLR) يجعل من إنشاء وتصميم المكونات الأساسية للتطبيقات والتطبيقات أسهل لأن الكائنات فيها تستطيع أن تتفاعل عبر اللغات. الكائنات التي كتبت في لغات مختلفة يمكن أن تتصل كل منهم مع الآخر، وسلوكهم يمكن أن يتكامل بإحكام. عل سبيل المثال، يمكنك أن تعرف صنف وبعد ذلك تستطيع استخدامه في لغة مختلفة ويمكن أن تشتق صنف Derive Class من صنفك الأصلي Original Class أو تدعو طريقة Method موجودة في الصنف الأصلي Original Class. يمكنك أن تمرر كائن (حالة) من صنف Instance Of a Class إلى طريقة من صنف Method Of a Class كتبت في لغة مختلفة. هذا التكامل عبر اللغة ممكن لأن المجمعات Compilers وأدوات Tools اللغة التي تستهدف وقت التشغيل تستخدم أنوع النظام المشتركة Common Type System تعرف في وقت التشغيل، وهم يتبعون قواعد وقت التشغيل لتعريف وإنشاء واستخدام أنواع جديدة، وربطهم مع الأنواع الأخرى.

كل المكونات المدارة Managed Components تحمل معلومات Metadata ومصادر Resources وطرق بناء لهذه المكونات. يستخدم وقت التشغيل Runtime هذه المعلومات كي يضمن لتطبيقك أو لعناصر التطبيقات جميع الإصدارات المحددة من العناصر والمكاتب المطلوبة، التي تجعل شيفرتك أقل عرضة للفشل بسبب بعض التوافقية المفقودة بين الإصدارات المتعاقبة للمكاتب. معلومات التوليد وحالة البيانات لم تعد بحاجة لتخزينها في محرر النظام Registry Editor حيث كانت هذه المهمة صعبة التأسيس والصيانة. على الأصح، المعلومات حول أنواعك المعرفة تخزن مع الملفات التي تحتوي على شيفرة تطبيقك كمعلومات مستقلة Metadata، تجعل مهمات الرد والإزالة للمكونات أقل تعقيد من ذي قبل بكثير.

مجمعات Compilers وأدوات Tools اللغة تعرضان وظائف وقت التشغيل Runtime's Functionality في الطرق التي تكون معدة لكي تكون مفيدة وبديهية للمطورين. من المحتمل لبعض ميزات وقت التشغيل أن تكون ظاهرة أكثر في إحدى بيئات التطوير عن مثيلاتها في بيئات تطوير أخرى. كيف تجرب المجمعات Compilers وأدوات Tools اللغة التي تستخدم وقت التشغيل Runtime. على سبيل المثال، إذا كنت أحد مطوري الفيجول بيسك، ربما تلاحظ بأنه مع وقت تشغيل اللغة المشترك Common Language Runtime، لغة فيجول بيسك أصبحت تملك ميزات أكثر من قبل في موضوع البرمجة غرضية التوجه Object-Oriented. مايلي سيعرض بعض فوائد وقت التشغيل Runtime:
• تحسين الأداء.
• المقدرة على استخدام مكونات أو أجزاء من تطبيقات كتبت في لغات أخرى بسهولة مطلقة.
• مزودة بمكتبة للأصناف قابلة للتوسيع أي إضافة بعض الميزات الجديدة التي تناسب متطلبات تطبيقك.
• مزودة بتقنيات أخرى عالمية مثل الوراثة Inheritance و الواجهات Interfaces وزيادة التحميل Overloading من أجل البرمجة غرضية التوجه Object-Oriented، ودعم كامل لتقنية تعدد المهام Multithreaded وتطبيقات قابلة لتكيف مع التوسع على مصادر النظام Scalable Applications ودعم لتقنية الاستثناءات Structured Exception Handling وكتابة ميزات للوظائف .Custom Attributes