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

بعض المبادئ لنطرق باب الإحتراف, لمن يريد أن يتعلم الدوت نت (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>

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

ليست هناك تعليقات: