أسمبلي (سي إل آي)

تجميعة (بالإنجليزية: Assembly) البنية التحتية المشتركة للغات هي مكتبة برمجية من الكود المُصرّف تستخدم أثناء تطوير البرمجيات وتعيين الإصدارات وتعزيز أمان البرمجيات. يوجد نوعان من التجميعات: التجميعات العملياتية (EXE) والتجميعات المكتبية (DLL). تمثل التجميعة العملياتية عمليةً تستخدم الصفوف المعرفة ضمن بعض التجميعات المكتبية. تحتوي تجميعات سي إل آي على كود مكتوبٍ باللغة المشتركة الوسيطة، ويتم توليد هذا الكود عادةً من إحدى لغات البنية التحتية المشتركة للغات (كلغة سي# مثلاً)، يُصرّف هذا الكود إلى تعمليات لغة الآلة من قبل مصرف يعمل في الوقت المناسب (بالإنجليزية: Just-in-time compiler). يشكل هذا المصرف في إطار عمل دوت نت جزءاً من وقت التنفيذ المشترك للغات.
يمكن للتجميعة أن تتضمن ملفاً واحداً أو أكثر. يُطلق على الملفات التي تحتوي الكود اسم وحدات (بالإنجليزية: modules). يمكن للتجميعة أن تحتوي على عدة وحدات. بما أنه من الممكن استخدام لغات برمجية مختلفة لكتابة الوحدات يمكن نظرياً استخدام عدة لغات برمجية لإنشاء تجميعة (على سبيل المثال يمكن استخدام لغة سي++/سي إل آي لكتابة بعض الوحدات الخاصة بالعمليات غير المُدارة كالولوج إلى الذاكرة الخاصة ببطاقة الشبكة عن طريق المؤشرات في حين تكتب باقي الوحدات باستخدام لغة سي#). إلا أن فيجوال ستوديو لا يدعم استخدام عدة لغات برمجة ضمن تجميعة واحدة.

التجميعات وأمن البنية التحتية المشتركة للغات

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

التجميعات التبعية

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