كيفية القيام بما يلي: ترحيل إلى clr/: خالص

يناقش هذا الموضوع المشكلات المحتمل أن تنشأ عند الترحيل إلى MSIL خالص باستخدام /clr:pure (راجع /clr (التجميع وقت تشغيل اللغة العامة) للحصول على مزيد من المعلومات). يفترض هذا الموضوع أن التعليمة البرمجية التي يتم ترحيلها محولة برمجيا حالياً كتجميع مختلط باستخدام الخيار /clr لأن مسار الترحيل من التعليمات البرمجية غير المُدارة إلى MSIL خالص غير مباشر. للتعليمات البرمجية غير المُدارة ، راجع كيفية القيام بما يلي: ترحيل إلى /clr قبل محاولة الترحيل إلى MSIL خالص.

تغييرات أساسية

MSIL خالص يتكون من إرشادات MSIL ، لذلك فإن التعليمات البرمجية التي تحتوي على دالات لا يمكن التعبير عنها في MSIL سيمنع التحويل البرمجي. يتضمن هذا الدالات المعرفة باستخدام اصطلاحات الاستدعاء غير __clrcall. (يمكن استدعاء وظائف غير clrcall__ في مكون MSIL خالص ، ولكن لا يمكن تعريفها.)

للتأكد من عدم وجود أخطاء وقت التشغيل، يجب أن تقوم بتمكين التحذير C4412. تمكين C4412 يكون عن طريق إضافة #pragma warning (default : 4412) إلى كل مُدخل التحويل البرمجي الذي ستقوم بتحويله بواسطة /clr:pure الذي يقوم بتمرير أنواع ++C من IJW ( /clr) أو من التعليمات البرمجية الأصلية. لمزيد من المعلومات، راجع برنامج التحويل البرمجي C4412 تحذير (المستوى 2).

اعتبارات بنائية

بعض قيود MSIL الخالص المسرودة في تعليمة برمجية خالصة و قابلة للتحقق لها ضمانات عالية المستوى لتصميم التطبيق و استراتيجية الترحيل. الأكثر ملاحظة ،أنه بعكس التجميعات مختلطة، تجميعات MSIL الخالص لا تتمتع بـالتوافق الكامل مع الوحدات النمطية غير المدارة.

يمكن لـ MSIL خالص استدعاء الدوال غير المُدارة ولكن لا يمكن استدعاؤه بواسطة وظائف لم تتم إدارتها. كنتيجة ، MSIL خالص هو الأفضل كمرشح لتعليمات العميل البرمجية التي تستخدم وظائف غير مدارة عن كونه مشرح لتعليمات الخادم البرمجية المستخدمة بواسطة وظائف غير مدارة. في حالة استخدام دالات غير مدارة للوظائف الموجودة في تجميع MSIL خالص ، يجب استخدام تجميع مختلط كطبقة واجهة.

التطبيقات التي تستخدم ATL أو MFC ليست مرشحا جيدا للحصول على الترحيل إلى MSIL خالص ، كما لا يتم اعتماد هذه المكتبات في هذا الإصدار. كذلك، Windows SDK يحتوي على ملف رأس لا يمكن تحويله برمجياً ضمن /clr:pure.

في حين أن MSIL خالص يمكنه استدعاء الدوال غير المُدارة ، تقتصر هذه القدرة على دالات بسيطة من نمط C. غالبا ما يتطلب استخدام API غير مدار أكثر تعقيداً، أن تكون الوظيفة غير المدارة معروضة في شكل واجهة COM ، أو تجميع مختلط يمكن أن يعمل كواجهة بين MSIL خالص ومكونات غير مدارة. استخدام طبقة تجميع مختلطة هي الطريقة الوحيدة لاستخدام دالات غير مدارة تأخذ وظائف رد الاتصال مثلا ، كما أن التجميع الخالص لا يستطيع توفير دالة أصلية قابلة للاستدعاء لاستخدامهـا كرد اتصال.

مجالات التطبيق و اصطلاحات الاتصال

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

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

على سبيل المثال، إذا كان مكون MSIL خالص يستدعي دالات في DLL غير مُدار أو مختلط , سيتم استخدام ملف الرأس لـ DLL لتحويل التجميع الخالص برمجياً. ومع ذلك، فإنه ما لم تتم الإشارة لكل اصطلاح استدعاء في ملف الرأس بوضوح ، فسيتم افتراض أنهـا كلها __clrcall. سيؤدي ذلك إلى فشل في وقت التشغيل لاحقاً لأنه من المحتمل أن يكون قد تم تطبيق هذه الدالات باصطلاح __cdecl . الدالات في ملف الرأس غير المدار يمكن وضع علامة عليها بشكل صريح كـ __cdecl ،و إلا فسيتم إعادة التحويل البرمجي للتعليمات البرمجية المصدر لـ DLL بأكملها ضمن /clr:pure.

وبالمثل، يفترض أن تشير مؤشرات الدالة إلى دالات __clrcall ضمن التحويل البرمجي لـ /clr:pure . هذه أيضاً يجب أن يتم التعليق عليها بشكل صريح مع اصطلاح الاستدعاء الصحيح.

لمزيد من المعلومات، راجع مجالات التطبيق و ++Visual C.

قيود إضافة ارتباطات

لن يحاول برنامج ربط Microsoft Visual C++ 2005 أن يربط ملفات OBJ المختلطة و الخالصة, حيث تختلف اصطلاحات نطاق التخزين و الاتصال.

راجع أيضًا:

المرجع

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