بعون الله نبدأ الدرس التاسع من سلسلة دروس هيا نتعلم بعض المبادء لنطرق باب الإحتراف
أتمنى من الله أن يمدكم بجلد لتقوموا بقراءة هذه الدروس بعناية
التجمعات – 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.
موعدنا إن شاء الله في الدروس القادمة أتمنى لكم التوفيق
ليست هناك تعليقات:
إرسال تعليق