التجميع (واجهة سطر الأوامر)

التجميع في بنية اللغة المشتركة (CLI) عبارة عن مكتبة برمجية مُجمّعة تُستخدم للنشر، والتحكم في الإصدارات، والأمان. يوجد نوعان: تجميعات العمليات ( EXE ) وتجميعات المكتبات ( DLL ). يُمثل تجميع العملية عمليةً تستخدم فئات مُعرّفة في تجميعات المكتبات. تحتوي تجميعات CLI على شيفرة مكتوبة بلغة CIL ، والتي تُولّد عادةً من لغة CLI ، ثم تُجمّع إلى لغة الآلة أثناء التشغيل بواسطة مُجمّع فوري . في تطبيق .NET Framework ، يُعد هذا المُجمّع جزءًا من بيئة تشغيل اللغة المشتركة (CLR).

يمكن أن يتكون التجميع من ملف واحد أو أكثر. تُسمى ملفات التعليمات البرمجية وحدات. يمكن أن يحتوي التجميع على أكثر من وحدة تعليمات برمجية واحدة. وبما أنه من الممكن استخدام لغات برمجة مختلفة لإنشاء وحدات التعليمات البرمجية، فمن الممكن تقنيًا استخدام عدة لغات مختلفة لإنشاء تجميع واحد. مع ذلك، لا يدعم Visual Studio استخدام لغات مختلفة في تجميع واحد.

أسماء التجمعات

يتكون اسم التجميع من أربعة أجزاء

  1. الاسم المختصر. في نظام ويندوز، هذا هو اسم ملف Portable Executable (PE) بدون الامتداد.
  2. اللغة. هذا مُعرِّف RFC 1766 للغة المستخدمة في التجميع. بشكل عام، يجب أن تكون تجميعات المكتبات والعمليات محايدة لغوياً؛ ويجب استخدام اللغة فقط للتجميعات الفرعية .
  3. الإصدار. وهو رقم منقط يتكون من أربع قيم - رئيسي، ثانوي، رقم البناء، ورقم المراجعة.
  4. رمز المفتاح العام . وهو عبارة عن تجزئة 64 بت للمفتاح العام الذي يتوافق مع المفتاح الخاص المستخدم لتوقيع [ 1 ] التجميع. ويُقال إن التجميع المُوقّع له اسم قوي .

يُستخدم رمز المفتاح العام لجعل اسم التجميعة فريدًا. وبالتالي، قد يكون لتجميعتين تحملان نفس اسم ملف PE، ومع ذلك سيتعرف عليهما سطر الأوامر كتجميعتين مختلفتين. نظام ملفات ويندوز ( FAT32 و NTFS ) لا يتعرف إلا على اسم ملف PE، لذا لا يمكن أن توجد تجميعتان تحملان نفس اسم ملف PE (ولكن بثقافة أو إصدار أو رمز مفتاح عام مختلف) في نفس مجلد ويندوز. لحل هذه المشكلة، يُقدم سطر الأوامر ذاكرة التخزين المؤقت للتجميعات العامة (GAC ) التي تُعامل كمجلد واحد أثناء التشغيل، ولكنها في الواقع مُنفذة باستخدام مجلدات نظام ملفات متداخلة.

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

إصدارات التجميع

يمكن أن تحتوي تجميعات واجهة سطر الأوامر على معلومات الإصدار، مما يسمح لها بالتخلص من معظم التعارضات بين التطبيقات الناتجة عن التجميعات المشتركة. [ 2 ] ومع ذلك، فإن هذا لا يزيل جميع تعارضات الإصدار المحتملة بين التجميعات. [ 3 ]

أمان التجميعات وواجهة سطر الأوامر

يعتمد أمان الوصول إلى التعليمات البرمجية في واجهة سطر الأوامر (CLI) على التجميعات والأدلة . يمكن أن تكون الأدلة أي شيء يُستنتج من التجميعة، ولكنها عادةً ما تُنشأ من مصدر التجميعة - سواءً تم تنزيل التجميعة من الإنترنت، أو شبكة داخلية ، أو تثبيتها على الجهاز المحلي (إذا تم تنزيل التجميعة من جهاز آخر، فسيتم تخزينها في موقع معزول داخل ذاكرة التجميع العمومية (GAC)، وبالتالي لا تُعامل على أنها مثبتة محليًا). تُطبق الأذونات على التجميعات بأكملها، ويمكن للتجميعة تحديد الحد الأدنى من الأذونات التي تتطلبها من خلال سمات مخصصة (انظر بيانات تعريف واجهة سطر الأوامر ). عند تحميل التجميعة، سيستخدم وقت تشغيل سطر الأوامر (CLR) الأدلة الخاصة بها لإنشاء مجموعة أذونات تتضمن إذنًا واحدًا أو أكثر للوصول إلى التعليمات البرمجية. ثم سيتحقق وقت تشغيل سطر الأوامر من أن مجموعة الأذونات هذه تحتوي على الأذونات المطلوبة التي حددتها التجميعة.

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

يمكن لرمز واجهة سطر الأوامر (CLI) أيضًا تنفيذ طلب مرتبط للحصول على الإذن من مكدس الاستدعاءات. في هذه الحالة، سيبحث وقت تشغيل اللغة العامة (CLR) عن طريقة واحدة فقط في مكدس الاستدعاءات، في الموضع العلوي، للحصول على الإذن المحدد. هنا، يرتبط استعراض المكدس بطريقة واحدة في مكدس الاستدعاءات، حيث يفترض وقت تشغيل اللغة العامة (CLR) أن جميع الطرق الأخرى في مكدس الاستدعاءات لديها الإذن المحدد. التجميع عبارة عن مزيج من ملف البيانات الوصفية (METADATA) وملف MSIL.

تجميعات الأقمار الصناعية

بشكل عام، يجب أن تحتوي التجميعات على موارد محايدة لغوياً. إذا كنت ترغب في ترجمة تجميعتك (على سبيل المثال، استخدام سلاسل نصية مختلفة للغات مختلفة)، فيجب عليك استخدام التجميعات الفرعية - وهي تجميعات خاصة تحتوي على الموارد فقط. كما يوحي الاسم، يرتبط التجميع الفرعي بتجميعة تُسمى التجميعة الرئيسية. تحتوي هذه التجميعة (مثلاً، lib.dll) على الموارد المحايدة (التي تُشير إليها مايكروسوفت بأنها الإنجليزية الدولية ، ولكنها تُشير ضمنياً إلى الإنجليزية الأمريكية). يحمل كل تجميع فرعي اسم المكتبة المرتبطة به مُلحقاً بـ .resources (على سبيل المثال، lib.resources.dll). يُعطى التجميع الفرعي اسماً لغوياً غير محايد، ولكن بما أن أنظمة ملفات ويندوز الحالية (FAT32 وNTFS) تتجاهل هذا الاسم، فهذا يعني أنه قد يكون هناك عدة ملفات بنفس اسم PE في مجلد واحد. ولأن هذا غير ممكن، يجب تخزين التجميعات الفرعية في مجلدات فرعية ضمن مجلد التطبيق. على سبيل المثال، سيكون للقمر الصناعي الذي يحتوي على موارد اللغة الإنجليزية البريطانية اسم CLI هو "lib.resources Version=0.0.0.0 Culture=en-GB PublicKeyToken=null"، واسم ملف PE هو lib.resources.dll، وسيتم تخزينه في مجلد فرعي يسمى en-GB.

يتم تحميل الأقمار الصناعية بواسطة فئة سطر أوامر تُسمى System.Resources.ResourceManager. يجب على المطور توفير اسم المورد ومعلومات حول التجميعة الرئيسية (مع الموارد المحايدة). ستقوم فئة ResourceManager بقراءة لغة الجهاز واستخدام هذه المعلومات واسم التجميعة الرئيسية للحصول على اسم القمر الصناعي واسم المجلد الفرعي الذي يحتويه. ResourceManagerبعد ذلك، يمكن تحميل القمر الصناعي والحصول على المورد المُترجم.

الإشارة إلى التجمعات

يمكن للمرء الإشارة إلى مكتبة التعليمات البرمجية القابلة للتنفيذ باستخدام علامة /reference الخاصة بمترجم لغة C#.

تأخير توقيع الجمعية

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

لغة الجمعية

يتم بناء التجميع باستخدام لغة CIL، وهي لغة وسيطة. يقوم الإطار داخليًا بتحويل لغة CIL ( الرمز البايتي ) إلى رمز التجميع الأصلي . إذا كان لدينا برنامج يطبع "Hello World"، فإن رمز CIL المكافئ للدالة هو:

. method private hidebysig static void Main ( string [] args ) cil managed { . entrypoint . custom instance void [ mscorlib ] System . STAThreadAttribute ::. ctor () = ( 01 00 00 00 ) // حجم الكود 11 (0xb) . maxstack 1 IL_0000 : ldstr "Hello World" IL_0005 : call void [ mscorlib ] System . Console :: WriteLine ( string ) IL_000a : ret } // نهاية الدالة Class1::Main

يقوم كود CIL بتحميل السلسلة النصية على المكدس، ثم يستدعي دالة WriteLine ويعيدها.

انظر أيضاً

مراجع

  1. "إعطاء اسم قوي لتجميعة .NET" . مؤرشف من الأصل في 24 فبراير 2012. تم الاطلاع عليه في 29 مارس 2007 .
  2. تروش، فيليب (12 أغسطس 2008). "دورة حياة إصدارات تجميعات .NET" . مؤرشف من الأصل في 24 أكتوبر 2008. تم الاطلاع عليه في 21 سبتمبر 2008 .
  3. بيرسون، هاري (17 سبتمبر 2008). "تدريب على تغيير مساحة أسماء قطار دوكلاندز الخفيف" . مؤرشف من الأصل في 1 نوفمبر 2008. تم الاطلاع عليه في 21 سبتمبر 2008 .