ما المقصود بمكتبة الارتباطات الديناميكية (DLL)؟


ملخص


تشرح هذه المقالة المقصود بمكتبة الارتباطات الديناميكية (DLL) والمشكلات المختلفة التي تقع عند استخدام مكتبات DLL.

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

وتنتهي هذه المقالة بمقارنة عالية المستوى بين مكتبات DLL وتجميعات Microsoft .NET Framework.

مقدمة


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

ويساعد استخدام مكتبات DLL على تعزيز تكوين الوحدات النمطية للتعليمة البرمجية وإعادة استخدام التعليمة البرمجية واستخدام الذاكرة الفعال وتقليل المساحة على القرص. وبالتالي، فإن نظام التشغيل والبرامج تُحمِّل تحميلاً أسرع وتعمل بشكلٍ أسرع وتشغل مساحة أقل على القرص بالكمبيوتر.

عندما يستخدم برنامج مكتبة ارتباطات ديناميكية، قد تتسبب مشكلة تُسمَّى التبعية في عدم تشغيل البرنامج. وعندما يستخدم برنامج إحدى مكتبات الارتباطات الديناميكية، تنشأ تبعية. وإذا استخدم برنامج آخر يكتب فوق هذه التبعية ويقاطعها، فربما لا يعمل البرنامج بنجاح.

مع تقديم Microsoft .NET Framework، اُستبْعِدَت معظم مشكلات التبعية عن طريق استخدام التجميعات.

مزيد من المعلومات


ما المقصود بمكتبة الارتباطات الديناميكية (DLL)؟

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

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

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

تشرح القائمة التالية بعض الملفات المنفذة باعتبارها مكتبات DLL في أنظمة تشغيل Windows:
  • ملفات (‎.ocx) الموجودة في عناصر تحكم ActiveX
    من الأمثلة على عنصر تحكم ActiveX عنصر التحكم في التقويم الذي يتيح لك تحديد بيانات من أحد التقاويم.
  • ملفات (‎.cpl) الموجودة في لوحة التحكم
    من الأمثلة على ملف ‎.cpl العنصر الموجود في لوحة التحكم. ويمثل كل عنصر مكتبة ارتباطات ديناميكية متخصصة.
  • ملفات (‎.drv) في برنامج تشغيل الجهاز
    من الأمثلة على برنامج تشغيل الجهاز برنامج تشغيل الطابعة الذي يتحكم في أوامر الطباعة إلى الطابعة.

ميزات DLL

تشرح القائمة التالية بعض الميزات المقدمة عندما يستخدم برنامج إحدى مكتبات DLL:
  • استخدام موارد أقل
    عندما تستخدم برامج متعددة دوال المكتبة ذاتها، يمكن لمكتبة الارتباطات الديناميكية تقليل النسخ المتماثل للتعليمة البرمجية المُحمَّلة على القرص وفي الذاكرة الفعلية. وهذا له تأثير كبير على أداء البرنامج الذي يعمل في الواجهة الأمامية، وأيضًا البرامج الأخرى التي تعمل على نظام التشغيل Windows.
  • تعزيز هندسة الوحدات النمطية
    تساعد مكتبة الارتباطات الديناميكية على تعزيز تطوير البرامج النمطية. وهذا يساعد على تطوير برامج كبيرة تتطلب إصدارات عديدة من اللغات أو برنامج يتطلب هندسة الوحدات النمطية. من الأمثلة على البرنامج النمطي برنامج المحاسبة الذي يشمل وحدات نمطية متعددة يمكن تحميلها ديناميكيًا في وقت التشغيل.
  • تسهيل النشر والتثبيت
    وعندما تحتاج إحدى الدوال ضمن مكتبة ارتباطات ديناميكية تحديثًا أو إصلاحًا، لا يلزم نشر مكتبة الارتباطات الديناميكية وتثبيتها إعادة ارتباط البرنامج بمكتبة الارتباطات الديناميكية. بالإضافة إلى ذلك، إذا استخدمت برامج عديدة مكتبة الارتباطات الديناميكية ذاتها، فستستفيد البرامج العديدة جميعها من التحديث أو الإصلاح. وقد تزداد وتيرة حدوث هذه المشكلة عندما تستخدم DLL تابعة لجهة خارجية يتم تحديثها أو إصلاحها بشكلٍ منتظم.

تبعيات DLL

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

تشرح القائمة التالية التغييرات التي أُدخِلَت على نظام التشغيل Microsoft Windows 2000 وعلى أنظمة تشغيل Windows اللاحقة له من أجل المساعدة في تقليل مشكلات التبعية إلى أقل حد ممكن:
  • حماية ملفات Windows
    في حماية ملفات Windows، يمنع نظام التشغيل تحديث مكتبات DLL بالنظام أو حذفه من قِبَل أي وكيل غير مُخوَّل. وبالتالي، عندما يحاول تثبيت أحد البرامج أن يزيل أو يحدث DLL مُعرَّفة بوصفها DLL للنظام، سوف تبحث "حماية ملفات Windows" عن توقيع رقمي صالح.
  • مكتبات DLL الخاصة
    تتيح لك مكتبات DLL الخاصة عزل أحد البرامج عن التغييرات التي أُجريت على مكتبات DLL المشتركة. تستخدم مكتبات DLL الخاصة معلومات خاصة بالإصدار أو ملف ‎.local فارغًا من أجل تفعيل إصدار DLL التي يستخدمها البرنامج. ولاستخدام مكتبات DLL الخاصة، حدد موقع مكتبات DLL في المجلد الجذر للبرنامج. ثم فيما يخص البرامج الجديدة، أضف المعلومات الخاصة بالإصدار إلى DLL. وفيما يخص البرامج القديمة، استخدم ملف ‎.local فارغًا. وكل طريقة تخبر نظام التشغيل باستخدام مكتبات DLL الخاصة الموجودة في المجلد الجذر بالبرنامج.

أدوات استكشاف أخطاء DLL وإصلاحها

تتوافر أدوات عديدة للمساعدة في استكشاف أخطاء DLL وإصلاحها. وفيما يلي بعض هذه الأدوات.

Dependency Walker

يمكن للأداة Dependency Walker إجراء فحص متكرر لجميع مكتبات DLL التي يستخدمها أحد البرامج. وعندما تفتح برنامجًا في Dependency Walker، فإنها تجري الفحوصات التالية:
  • تتحقق Dependency Walker من مكتبات DLL المفقودة.
  • تتحقق Dependency Walker من ملفات البرنامج أو مكتبات DLL غير الصالحة.
  • تتحقق Dependency Walker من تطابق دوال الاستيراد ودوال التصدير.
  • تتحقق Dependency Walker من وجود أخطاء في التبعية الدائرية.
  • تتحقق Dependency Walker من الوحدات النمطية غير الصالحة نظرًا لتبعية الوحدات النمطية إلى نظام تشغيل مختلف.
باستخدام Dependency Walker، يمكنك توثيق جميع مكتبات DLL التي يستخدمها برنامج معين. وقد يساعد ذلك على منع حدوث مشكلات DLL التي قد تحدث في المستقبل، بل وتصحيحها. توجد Dependency Walker في الدليل التالي عندما تثبت Microsoft Visual Studio 6.0:
محرك الأقراص\Program Files\Microsoft Visual Studio\Common\Tools

DLL Universal Problem Solver

تُستخدَم الأداة DLL Universal Problem Solver (DUPS) في تدقيق معلومات DLL ومقارنتها وتوثيقها وعرضها. تشرح القائمة التالية الأدوات المساعدة التي تكون الأداة DUPS:
  • Dlister.exe
    تحصي هذه الأداة المساعدة عدد جميع مكتبات DLL على الكمبيوتر وتسجل المعلومات في ملف نصي أو ملف قاعدة بيانات.
  • Dcomp.exe
    تقارن هذه الأداة المساعدة مكتبات DLL المسرودة في ملفين نصيين وتنتج ملفًا نصيًا ثالثًا يتضمن الفروق.
  • Dtxt2DB.exe
    تُحمِّل هذه الأداة المساعدة الملفات النصية التي أُنشِئَت باستخدام الأداة المساعدة Dlister.exe والأداة المساعدة Dcomp.exe في قاعدة بيانات dllHell.
  • DlgDtxt2DB.exe
    توفر هذه الأداة المساعدة إصدارًا من الأداة المساعدة Dtxt2DB.exe لواجهة المستخدم الرسومية (GUI).
لمزيدٍ من المعلومات حول الأداة DUPS، انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft" (قد تحتوي هذه المقالة على ارتباطات إلى محتوى باللغة الإنجليزية (محتوى لم تتم ترجمته بعد)):
247957 استخدام DUPS.exe في حل مشكلات توافق DLL
 

قاعدة بيانات DLL

تساعد قاعدة بيانات تعليمات DLL في تحديد موقع إصدارات معينة من مكتبات DLL التي ثبتتها منتجات برامج Microsoft. 

تطوير DLL

يشرح هذا القسم المشكلات والمتطلبات التي يجب أن تتدبرها عند قيامك بتطوير مكتبات DLL الخاصة بك.

أنواع مكتبات DLL

عند قيامك بتحميل DLL في أحد التطبيقات، توجد طريقتان تتيحان لك استدعاء دوال DLL المُصدَّرة. وتتمثل طريقتا الارتباط في الارتباط الديناميكي في وقت التحميل والارتباط الديناميكي في وقت التشغيل.
الارتباط الديناميكي في وقت التحميل
في الارتباط الديناميكي في وقت التحميل، يصدر التطبيق استدعاءات صريحة لدوال DLL المُصدَّرة مثل الدوال المحلية. ولاستخدام الارتباط الديناميكي في وقت التحميل، وفر ملف رأس (‎.h) وملف مكتبة استيراد (‎.lib) عند تجميع تطبيق وربطه. وعند القيام بذلك، يزود الرابط النظام بالمعلومات اللازمة لتحميل DLL وحل مواقع دوال DLL المُصدَّرة في وقت التحميل.
الارتباط الديناميكي في وقت التشغيل
في الارتباط الديناميكي في وقت التشغيل، يستدعي التطبيق إما دالة LoadLibrary أو دالة LoadLibraryEx لتحميل DLL في وقت التشغيل. وبعد تحميل DLL بنجاح، استخدم دالة GetProcAddress للحصول على عنوان دالة DLL المُصدَّرة التي تريد استدعاءها. عندما تستخدم الارتباط الديناميكي في وقت التشغيل، لا تحتاج إلى ملف مكتبة استيراد.

تشرح القائمة التالية معايير التطبيق لوقت استخدام الارتباط الديناميكي في وقت التحميل ووقت استخدام الارتباط الديناميكي في وقت التشغيل:
  • الأداء عند بدء التشغيل
    في حالة تميز الأداء المبدئي عند بدء التشغيل بأهميةٍ ما، يجب عليك استخدام الارتباط الديناميكي في وقت التشغيل.
  • سهولة الاستخدام
    في الارتباط الديناميكي في وقت التحميل، تشبه دوال DLL المُصدَّرة الدوال المحلية. وهذا يسهل عليك استدعاء هذه الدوال.
  • القواعد المنطقية للتطبيق
    في الارتباط الديناميكي في وقت التشغيل، يمكن لتطبيق أن يتفرع من أجل تحميل وحدات نمطية حسب المطلوب. وهذا مهم عند تطوير إصدارات متعددة اللغات.

نقطة إدخال DLL

عندما تنشئ DLL، يمكنك اختياريًا تحديد دالة لنقطة الإدخال؛ حيث يمكن استدعاء دالة نقطة الإدخال عندما تربط العمليات أو مؤشرات الترابط نفسها بمكتبة الارتباطات الديناميكية (DLL) أو تفصل نفسها عنها. يمكنك استخدام دالة نقطة الإدخال لبدء بُنى البيانات أو تدمير بُنى البيانات حسب ما تتطلب DLL. بالإضافة إلى ذلك، إذا كان التطبيق متعدد مؤشرات الترابط، فيمكنك استخدام التخزين المحلي لمؤشرات الترابط (TLS) لتخصيص الذاكرة التي تخص كل مؤشر ترابط في دالة نقطة الإدخال. والتعليمة البرمجية التالية مثال على دالة نقطة إدخال DLL.
BOOL APIENTRY DllMain(HANDLE hModule,// Handle to DLL moduleDWORD ul_reason_for_call,// Reason for calling functionLPVOID lpReserved ) // Reserved{switch ( ul_reason_for_call ){case DLL_PROCESS_ATTACHED:// A process is loading the DLL.break;case DLL_THREAD_ATTACHED:// A process is creating a new thread.break;case DLL_THREAD_DETACH:// A thread exits normally.break;case DLL_PROCESS_DETACH:// A process unloads the DLL.break;}return TRUE;}
وعندما تُرجِع دالة نقطة الإدخال قيمة FALSE ، لن يبدأ تشغيل التطبيق إذا كنت تستخدم الارتباط الديناميكي في وقت التحميل. وإذا كنت تستخدم الارتباط الديناميكي في وقت التشغيل، فلن يتم تحميل DLL الفردية فقط.

فينبغي على دالة نقطة الإدخال تنفيذ مهام تهيئة بسيطة فقط، كما ينبغي عليها عدم استدعاء أي دوال تحميل أو إنهاء أخرى في DLL. على سبيل المثال، في دالة نقطة الإدخال، ينبغي عدم استدعاء دالة LoadLibrary أو دالة LoadLibraryEx بشكلٍ مباشر أو غير مباشر. بالإضافة إلى ذلك، ينبغي عدم استدعاء دالة FreeLibrary عند إنهاء العملية.

ملاحظة في التطبيقات متعددة مؤشرات الترابط، تأكد من أن الوصول إلى بيانات DLL الشاملة متزامن (مؤشر ترابط آمن) لتفادي إمكانية حدوث تلف للبيانات. وللقيام بذلك، استخدم TLS لتوفير بيانات فريدة لكل مؤشر ترابط.

تصدير دوال DLL

لتصدير دوال DLL، يمكنك إما إضافة كلمة أساسية للدالة إلى دوال DLL المُصدَّرة أو إنشاء ملف تعريف للوحدة النمطية (‎.def) الذي يسرد دوال DLL المُصدَّرة.

لاستخدام كلمة أساسية للدالة، يجب الإعلان عن كل دالة تريد تصديرها مع الكلمة الأساسية التالية:
__declspec(dllexport)
لاستخدام دوال DLL مُصدَّرة في التطبيق، يجب الإعلان عن كل دالة تريد استيرادها مع الكلمة الأساسية التالية:
__declspec(dllimport)
يمكنك عادةً استخدام ملف رأس واحد يحتوي على عبارة define وعبارة ifdef للفصل بين عبارة التصدير وعبارة الاستيراد.

يمكنك أيضًا استخدام ملف لتعريف الوحدة النمطية من أجل الإعلان عن دوال DLL المُصدَّرة. وعندما تستخدم ملفًا لتعريف الوحدة النمطية، لا يلزمك إضافة الكلمة الأساسية للدالة إلى دوال DLL المُصدَّرة. في ملف تعريف الوحدة النمطية، أعلن عن عبارة LIBRARY وعبارة EXPORTS لمكتبة الارتباطات الديناميكية (DLL). والتعليمة البرمجية التالية مثال على ملف التعريف.
// SampleDLL.def//LIBRARY "sampleDLL"EXPORTS  HelloWorld

نمذجة DLL وتطبيقها

يمكنك في Microsoft Visual C++ 6.0 إنشاء DLL بتحديد نوع المشروع Win32 Dynamic-Link Library أو
نوع المشروع MFC AppWizard (dll).

تُعَد التعليمة البرمجية التالية مثالاً على DLL التي تم إنشاؤها في Visual C++ باستخدام
نوع المشروع Win32 Dynamic-Link Library.
// SampleDLL.cpp//#include "stdafx.h"#define EXPORTING_DLL#include "sampleDLL.h"BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved ){    return TRUE;}void HelloWorld(){MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);}
// File: SampleDLL.h//#ifndef INDLL_H#define INDLL_H#ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;#elseextern __declspec(dllimport) void HelloWorld() ;#endif#endif
التعليمة البرمجية التالية مثال على مشروع Win32 Application الذي يستدعي دالة DLL المُصدَّرة في مكتبة الارتباطات الديناميكية SampleDLL.
// SampleApp.cpp //#include "stdafx.h"#include "sampleDLL.h"int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){ HelloWorld();return 0;}
ملاحظة في الارتباط الديناميكي في وقت التحميل، يجب عليك الارتباط بمكتبة الاستيراد SampleDLL.lib التي تم إنشاؤها عندما بنيت مشروع SampleDLL.

في الارتباط الديناميكي في وقت التشغيل، استخدم التعليمة البرمجية المشابهة للتعليمة البرمجية التالية لاستدعاء دالة DLL المُصدَّرة SampleDLL.dll.
...typedef VOID (*DLLPROC) (LPTSTR);...HINSTANCE hinstDLL;DLLPROC HelloWorld;BOOL fFreeDLL;hinstDLL = LoadLibrary("sampleDLL.dll");if (hinstDLL != NULL){    HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");    if (HelloWorld != NULL)        (HelloWorld);    fFreeDLL = FreeLibrary(hinstDLL);}...
عندما تجمع تطبيق SampleDLL وتربطه، يبحث نظام تشغيل Windows عن مكتبة الارتباطات الديناميكية SampleDLL في المواقع التالية بهذا الترتيب:
  1. مجلد التطبيق
  2. المجلد الحالي
  3. مجلد نظام Windows

    ملاحظة تُرجِع الدالة GetSystemDirectory مسار مجلد نظام Windows.
  4. مجلد Windows

    ملاحظة تُرجِع الدالة GetWindowsDirectory مسار مجلد Windows.

تجميع ‎.NET Framework

مع تقديم Microsoft .NET و‎.NET Framework، استُبعِدَت معظم المشكلات المقترنة بمكتبات DLL باستخدام التجميعات. ويُعَد التجميع وحدة منطقية للوظيفة التي تعمل تحت تحكم وقت تشغيل اللغة العامة (CLR) في ‎.NET. ويوجد التجميع في شكل مادي في صورة ملف ‎.dll أو ‎.exe. وعلى الرغم من ذلك، يختلف التجميع داخليًا اختلافًا كبيرًا عن مكتبة الارتباطات الديناميكية Microsoft Win32.

يحتوي ملف التجميع على بيان تجميع وبيانات تعريف النوع والتعليمة البرمجية Microsoft intermediate language (MSIL)، بالإضافة إلى الموارد الأخرى. ويحتوي بيان التجميع على بيانات تعريف النوع التي تقدم جميع المعلومات اللازمة للتجميع حتى يكون ذاتي الوصف. ويتم تضمين المعلومات التالية في بيان التجميع:
  • اسم التجميع
  • معلومات الإصدار
  • معلومات الثقافة
  • معلومات الاسم القوي
  • قائمة الملفات بالتجميع
  • معلومات مرجع النوع
  • معلومات التجميع التابع والمرجعي
لا يمكن تنفيذ التعليمة البرمجية MSIL المُضمَّنة في التجميع تنفيذًا مباشرًا. وعوضًا عن ذلك، فإن تنفيذ التعليمة البرمجية MSIL يُدار من خلال CLR. وافتراضيًا، عندما تنشئ تجميعًا،سيكون خاصًا بالتطبيق. ولإنشاء تجميع مشترك، يجب عليك تعيين اسم قوي إلى التجميع ثم نشر التجميع في مخزن التجميع المؤقت الشامل.

تشرح القائمة التالية بعض ميزات التجميعات بالمقارنة مع ميزات مكتبات الارتباطات الديناميكية Win32:
  • الوصف الذاتي
    عندما تنشئ تجميعًا، تُدرَج جميع المعلومات المطلوبة لوقت تشغيل اللغة العامة (CLR) من أجل تشغيل التجميع ضمن بيان التجميع؛ مع العلم بأن بيان التجميع يحتوي على قائمة بالتجميعات التابعة. وبالتالي، يمكن لوقت تشغيل اللغة العامة الحفاظ على مجموعة متناسقة من التجميعات المستخدمة في التطبيق. في مكتبات الارتباطات الديناميكية Win32، لا يمكنك الحفاظ على التناسق بين مجموعة مكتبات DLL المستخدمة في التطبيق عندما تستخدم مكتبات DLL المشتركة.
  • تعيين الإصدار
    في بيان التجميع، تُسجَّل معلومات الإصدار ويفرضها وقت تشغيل اللغة العامة. بالإضافة إلى ذلك، فإن سياسات الإصدار تتيح لك فرض استخدام خاص بالإصدار. في مكتبات الارتباطات الديناميكية Win32، لا يمكن فرض تعيين الإصدار بواسطة نظام التشغيل. وبدلاً من ذلك، يجب عليك التأكد من أن مكتبات DLL متوافقة مع الإصدارات السابقة.
  • النشر جنبًا إلى جنب
    تدعم التجميعات النشر جنبًا إلى جنب. يمكن لأحد التطبيقات أن يستخدم أحد إصدارات التجميع، في حين يستخدم تطبيق آخر إصدارًا مختلفًا من التجميع. وبدءًا من نظام التشغيل Windows 2000، يُدعم النشر جنبًا إلى جنب عن طريق تحديد مواقع مكتبات DLL في مجلد التطبيق. بالإضافة إلى ذلك، تمنع حماية ملفات Windows الكتابة فوق مكتبات DLL بالنظام أو الاستبدال بها من قِبَل أي وكيل غير مُخوَّل.
  • التضمين الذاتي والعزل
    يمكن تضمين التطبيق المُطوَّر باستخدام أحد التجميعات ذاتيًا وعزله عن التطبيقات الأخرى التي تعمل على الكمبيوتر. وتساعدك هذه الميزة على إنشاء تثبيتات دون أي تأثيرات.
  • التنفيذ
    يعمل التجميع بموجب أذونات أمان المتوفرة في بيان التجميع ويتحكم فيها وقت تشغيل اللغة العامة.
  • الاستقلالية عن اللغة
    يمكن تطوير أحد التجميعات باستخدام أيٍّ من لغات ‎.NET المدعومة. على سبيل، المثال، يمكنك تطوير تجميع في Microsoft Visual C#‎، ثم استخدام التجميع في مشروع Microsoft Visual Basic .NET.