تعليمة برمجية خالصة و قابلة للتحقق

لبرمجة .NET , يدعم Visual C++ إنشاء ثلاثة أنواع مختلفة من المكونات و التطبيقات: مختلطة، و خالصة، و قابلة للتحقق. تتوفر الثلاثة من خلال خيار المحول البرمجي /clr (التجميع وقت تشغيل اللغة العامة) .

ملاحظات

للحصول على مزيد من المعلومات حول هذه التجميعات، راجع .

(clr/) مختلط

التجميعات المختلطة (المترجمة برمجياً بواسطة /clr) ، تحتوي على كلا من الأجزاء الغير المدارة و المدارة مما يسمح لهم باستخدام ميزات .NET التى لا تزال تحتوى على تعليمات برمجية غير مُدارة. يسمح هذا للتطبيقات و المكونات بالتحديث لاستخدام ميزات .NET دون الحاجة إلى أن يتم إعادة كتابة المشروع بأكمله. استخدام Visual C ++ لمزج التعليمات البرمجية المدارة و الغير المدارة بهذه الطريقة يسمى (C++ Interop) توافق C++. للمزيد من المعلومات، راجع تجميعات مختلطة (أصلية و مدارة) وإمكانية التشغيل التفاعلي الأصلي و الـ .NET.

فقط (clr:pure/)

التجميعات الخالصة (المترجمة برمجياً بواسطة /clr:pure) يمكن أن تحتوي كل من نوعي البيانات الأصلية و المدارة لكن فقط مع الدالات المدارة. مثل التجميعات المختلطة , التجميعات الخالصة تسمح بإمكانية التشغيل المتداخل مع DLLs أصلية خلال P/Invoke (راجع استخدام PInvoke Explicit في ++C (سمة DllImport)) ، ولكن ميزات Interop C++ غير متوفرة. كذلك، التجميعات الخالصة لا يمكنها تصدير الدوال القابلة للاستدعاء من قبل الدالات الأصلية لأن نقاط الإدخال في التجميع الخالص تستخدم اصطلاح الاستدعاء __clrcall .

فوائد /clr:pure

  • أداء أفضل لأن التجميعات الخالصة تحتوى على MSIL فقط و لا توجد أي دالات أصلية ولذلك فإن الانتقالات المُدارة/غير المُدارة غير ضرورية. (استدعاءات الدالات التي تم إجراؤها من خلال P/Invoke هى استثناء لهذه القاعدة.)

  • معرفة AppDomain: الدالات المدارة وأنواع البيانات CLR توجد داخل Application Domains ، مما يؤثر على الرؤية و إمكانية الوصول الخاصة بهم. التجميعات الخالصة تعرِف المجال (يتم تضمين __declspec(appdomain) لكل نوع) حتى يكون الوصول إلى الأنواع والدالات الخاصة بهم من مكونات .NET الأخرى أسهل و أكثر أماناً. نتيجة لذلك، تتفاعل التجميعات الخالصة بشكل أكثر سهولة مع مكونات .NET الأخرى عن التجميعات المختلطة.

  • تحميل بدون قرص: التجميعات الخالصة يمكن تحميلها في الذاكرة أو حتى دفقها. هذا ضرورى من أجل استخدام تجميعات .NET كإجراءات مخزنة. هذا يختلف عن التجميعات المختلطة التي، بسبب التبعية لآليات تحميل Windows، يجب أن تكون موجودة على القرص و مرتبة حتى يتم التنفيذ.

  • انعكاس : لا يمكن الانعكاس على الملفات التنفيذية المختلطة ، بينما التجميعات الخالصة توفر الدعم الكامل للانعكاس. لمزيد من المعلومات، راجع الانعكاس في ++C.

  • قابلية المضيف للتحكم : لأن التجميعات الخالصة تحتوي على MSIL فقط, فإنها تتصرف بشكل متوقع و مرونة أكثر من المختلطة عند استخدامها في التطبيقات التي تستضيف CLR وتعديل سلوكها الافتراضي .

قيود /clr:pure

يغطي هذا المقطع ميزات غير معتمدة حالياً فى /clr:pure.

  • التجميعات الخالصة لا يمكن استدعاؤها بواسطة دالات غير مدارة. و بالتالي، فإن التجميعات الخالصة لا تقوم بتنفيذ واجهات COM أو تعرض عمليات الاسترجاعات الأصلي. التجميعات الخالصة لا يمكنها تصدير دالات عبر __declspec(dllexport) أو ملفات .DEF. أيضاً ,الدالات المصرح بها باصطلاح __clrcall لا يمكن استيرادها عبر __declspec(dllimport). يمكن استدعاء الدالات في الوحدة النمطية الأصلية من تجميع خالص، لكن التجميعات الخالصة لا يمكنها عرض الدالات الأصلية القابلة للاستدعاء، لذا فإن عرض وظيفة في تجميع خالص يجب أن بتم فقط من خلال دالات مدارة في تجميع مختلط. لمزيد من المعلومات، راجع كيفية القيام بما يلي: ترحيل إلى clr/: خالص.

  • لا يتم اعتماد ATL ومكتبات MFC من قبل التحويل البرمجي فى الوضع الخالص في Visual C++ 2005.

  • خالص. netmodules غير مقبولة كإدخال إلى رابط Visual C + +. و على كل حال، فإن ملفات obj الخالصة يقبلها الرابط كما أن ملفات obj تحتوي على مجموعة شاملة من المعلومات الموجودة في netmodules. لمزيد من المعلومات، راجع ملفات .netmodule كـ الإدخال رابط.

  • لا يتم اعتماد دعم COM لبرنامج التحويل البرمجي (#import)، لأن هذا قد يؤدى إلى تقديم إرشادات غير مدارة إلى تجميع خالص.

  • خيارات النقطة العائمة للمحاذاة و معالجة الاستثناءات غير قابلة للضبط بالنسبة للتجميعات الخالصة . ونتيجة لذلك، لا يمكن استخدام __declspec(align). هذا يعرض بعض ملفات الرأس مثل fpieee.h ، غير متوافقة مع /clr: خالصة.

  • دالة GetLastError في PSDK يمكنها إعطاء سلوك غير محدد عند التحويل البرمجي بواسطة /clr:pure.

(/ clr:safe) القابلة للتحقق

يقوم خيار برنامج التحويل البرمجي /clr:safe بإنشاء تجميعات قابلة للتحقق , مثل تلك المكتوبة في Visual Basic و C# ، المطابقة للمتطلبات التى تسمح لوقت تشغيل اللغة العامة (CLR) بضمان أن التعليمات البرمجية لا تنتهك إعدادات الأمان الحالية. على سبيل المثال، إذا منعت إعدادات الأمان مكوناً من الكتابة على القرص، فإن CLR يمكنه تحديد ما إذا كان هناك مكون قابل للتحقق يتوافق مع هذا المعيار قبل تنفيذ أي من التعليمات البرمجية. لا يوجد أي دعم CRT للتجميعات القابلة للتحقق. (يتوفر دعم CRT للتجميعات الخالصة خلال إصدار MSIL فقط لمكتبة وقت التشغيل C.)

التجميعات القابلة للتحقق توفر هذه الميزات عبر التجميعات الخالصة و المختلطة :

  • أمان متزايد.

  • تتطلب بعض الحالات ذلك( مكونات SQL ، على سبيل المثال).

  • الإصدارات المستقبلية من Windows ستتطلب بشكل متزايد أن تكون المكونات والتطبيقات قابلة للتحقق.

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

بالرغم من استخدام الكلمة "آمن", فإن ترجمة التطبيقات بواسطة /clr:safe لا يعني عدم وجود أي أخطاء(bugs); إنما يعني فقط أن CLR يمكنه التحقق من إعدادات الأمان في وقت التشغيل.

بغض النظر عن نوع التجميع , الاستدعاءات التي تم إجراؤها من قبل التجميعات المدارة لـ DLLs الأصلية بواسطة P/Invoke سيتم ترجمتها، ولكن قد تفشل في وقت التشغيل اعتماداً على إعدادات الأمان.

ملاحظة

هناك سيناريو كتابة تعليمات برمجية واحد يتخطى المحول البرمجي ولكن النتيجة ستكون تجميعاً غير قابل للتحقق: استدعاء دالة ظاهرية خلال مثيل كائن باستخدام عامل دقة النطاق. فعلى سبيل المثال: MyObj -> A::VirtualFunction();.

راجع أيضًا:

موارد أخرى

دليل البرمجة لـ NET.