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

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

المشاكل المعروفة فى ترجمة مشاريع المكتبة برمجياً من خلال /clr

يحتوي Visual Studio على بعض المشكلات المعروفة عند ترجمة مشاريع المكتبة برمجياً بواسطة /clr:

  • التعليمات البرمجية قد تستعلم عن أنواع في وقت التشغيل بواسطة CRuntimeClass::FromName. ومع ذلك، إذا كان نوع في .dll MSIL (المترجمة برمجياً بواسطة /clr) ، فإن الاستدعاء لـ CRuntimeClass::FromName قد يفشل في حالة حدوثه قبل تشغيل المُنشِئات الثابتة في .dll المدارة (لن ترى هذه المشكلة إذا حدث استدعاء FromName بعد تنفيذ التعليمات البرمجية في .dll المدارة). كمحاولة للتغلب على هذه المشكلة يمكنك فرض بناء مُنشئ ثابت مدار بواسطة تعريف الدالة في .dll المدارة و تصديرها ثم استدعائها من تطبيق MFC الأصلي. فعلى سبيل المثال:

    // Extension DLL Header file:
    __declspec( dllexport ) void EnsureManagedInitialization () {
       // managed code that won't be optimized away
       System::GC::KeepAlive(System::Int32::MaxValue);
    }
    

يحول برمجياً مع Visual C + +

قبل استخدام /clrتشغيل أية وحدة نمطية في مشروع، أول الترجمة وربط مشروع الأصلي باستخدام Visual Basic 2010 Studio.

الخطوات التالية متبوعة بالترتيب، توفر المسار الأسهل للتحويل البرمجى /clr . من المهم ترجمة المشروع برمجياً و تشغيلها بعد كل من هذه الخطوات.

الإصدارات قبل Visual C++ 2003

إذا كنت تقوم بالترقية إلى ‏‫Visual Studio 2010 من الإصدار سابق إلى Visual C + + 2003، قد ترى الأخطاء المترجم المتعلقة إلى المطابقة قياسي C + + المحسن 2003 "C + +" Visual Basic

الترقية من Visual C++ 2003

يجب أيضا أولاً يمكن تصنيف مشاريع السابقة مضمنة مع 2003 C + + Visual Basic بدون /clrكما قام ببرنامج ‏‫Visual Studio الآن زيادة التوافق ‏‫ANSI/ISO وبعض التغييرات الفاصلة. التغيير المحتمل يتطلب انتباها أكثر لـ تحسينات الأمان في CRT. التعليمات البرمجية التي تستخدم في CRT على الأرجح ستؤدى إلى تحذيرات يمكن إهمالها يمكن منع هذه التحذيرات، ولكن ترحيلها إلى أمان محسنة إصدارات CRT أعضاء البيانات الجديد أفضل لأنها توفر أماناً أفضل و قد تكشف عن مشكلات في التعليمات البرمجية.

الترقية من ملحقات مدارة لـ C++‎

المشاريع المضمنة بواسطة Visual C++ .NET أو Visual C++ 2003 التى تستخدم ملحقات مدارة ل C++ سوف تتطلب تغييرا واحدا على الأقل على إعدادات المشروع حيث أنه يتم إهمال هذه الملحقات الآن. نتيجة لذلك، التعليمات البرمجية المكتوبة بواسطة الملحقات المدارة لـ C++ لن تحول برمجياً ضمن /clr. استخدم /clr:oldSyntaxبدلاً منه.

تحويل تعليمات C البرمجية إلى C++‎

وعلى الرغم من أن يتم التحويل البرمجي ‏‫Visual Studio ملفات C، من الضروري تحويلها إلى C + + /clrالتحويل البرمجي. لا يحتوي اسم الملف الفعلي للتغيير؛ يمكن استخدام /Tp(see/ TC ، /TP /Tp /TC ، (تحديد نوع ملف المصدر).) لاحظ أنه بالرغم من أن ملفات تعليمات برمجية المصدر C + + مطلوبة من أجل /clr، فإنه هو غير الضروري re-factor تعليمات برمجية باستخدام paradigms مبنية على كائن.

تعليمات C البرمجية تتطلب على الأرجح تغييرات عند تحويلها برمجياً كملف C++. قواعد أمان نوع C++ صارمة ، لذا يجب إجراء عمليات تحويل النوع صراحةً عن طريق التحويل cast. على سبيل المثال، تُرجع malloc مؤشرا خاليا، ولكن يمكن تعيينها إلى مؤشر إلى أي نوع في C بواسطة التحويل cast:

int* a = malloc(sizeof(int));   // C code
int* b = (int*)malloc(sizeof(int));   // C++ equivalent

مؤشرات الدالات أيضاً آمنة النوع بشكل صارم في C++ ، بحيث تتطلب تعليمة C البرمجية التالية تعديلاً. في C++ من الأفضل إنشاء typedef الذي يعرّف نوع مؤشر الدالة ثم استخدام هذا النوع لتحويل مؤشرات الدالة:

NewFunc1 = GetProcAddress( hLib, "Func1" );   // C code
typedef int(*MYPROC)(int);   // C++ equivalent
NewFunc2 = (MYPROC)GetProcAddress( hLib, "Func2" );

يتطلب C++ أيضاً دالات إما بنموذجها الأولى أو معرفة بشكل كامل قبل أن يتم الرجوع إليها أو استدعائها.

معرفات المستخدم في تعليمات C البرمجية التى حدث و كانت كلمات أساسية في C++ (مثل virtual، new، delete، bool، true، false إلخ) يجب إعادة تسميتها. يمكن عادةً إجراء ذلك بواسطة عمليات البحث و الاستبدال البسيطة.

وأخيراً، بينما تتطلب استدعاءات COM من نمط C استخداماً صريحاً لجدول v و مؤشر this ،فإن هذا لا ينطبق على C++‎:

COMObj1->lpVtbl->Method(COMObj, args);  // C code
COMObj2->Method(args);  // C++ equivalent

أعد تكوين إعدادات المشروع

بعد تجميع مشروع و التشغيل في 2010 ‏‫Visual Studio ويجب إنشاء جديد للمشروع تكوينات ل /clrبدلاً من تعديل التكوينات الافتراضية. /clrهو غير متوافق مع بعض الخيارات المترجم ويتيح التكوينات منفصلة بنية بنية مشروع الأصلي أو المدارة. عند تحديد /clr في مربع الحوار صفحات الخاصية , يتم تعطيل إعدادات المشروع غير المتوافقة مع /clr(و خيارات المعطلة لا يتم استعادتها تلقائياً إذا كان /clr غير محدد في وقت لاحق).

قم بإنشاء إعدادات مشروع جديد

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

المشاريع التى تستخدم قاعدة بناء مخصصة تتطلب انتباه إضافي.

هذه الخطوة لها تبعات مختلفة للمشاريع التي تستخدم makefiles. في هذه الحالة يمكن تكوين هدف بناء منفصل أو إنشاء تحويل برمجى /clr خاص بالإصدار من نسخة من الأصلية.

قم بتغيير إعدادات المشروع

يمكن تحديد /clr في بيئة التطوير باتباع الإرشادات الموجودة في/clr (التجميع وقت تشغيل اللغة العامة). كما ذكر مسبقاً يتم تلقائياً تقوم هذه الخطوة بتعطيل إعدادات المشروع المتعارضة.

ملاحظة

عند تتم الآن الترقية مشروع الخدمة ويب أو مكتبة مدارة من Visual C + + 2003 /Zlإلى خيار المترجم تمت الإضافة إلى من سطر الأوامر خاصية الصفحة. سيؤدي ذلك إلى LNK2001. قم بإزالة /Zl من صفحة الخاصية سطر الأوامر لحل المشكلة. لمزيد من المعلومات، راجع /Zl (حذف اسم مكتبة الافتراضية) و كيفية: صفحات الخصائص المشاريع المفتوحة . أو أضف msvcrt.lib msvcmrt.lib إلى خاصية الرابط التبعيات إضافية .

للمشاريع المبنية بواسطة makefiles, خيارات برنامج التحويل البرمجى الغير المتوافقة يجب تعطيلها يدوياً مرة واحدة. يضاف /clr. راجع / /clr قيود لمزيد من المعلومات حول خيارات برنامج التحويل البرمجى غير المتوافقة مع /clr.

ملف الرأس المترجم برمجياً مسبقاً

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

أسهل طريقة لترجمة مشروع برمجياً حيث تكون بعض الوحدات النمطية مترجمة برمجياً بـ /clr هى تعطيل ملفات الرأس المترجمة برمجياً مسبقاً بالكامل. (في مربع الحوار صفحات خاصية المشروع, افتح العقدة C/C++ وحدد ملفات الرأس المترجمة برمجياً مسبقاً. قم بتغيير الخاصية إنشاء/استخدام ملفات الرأس المترجمة برمجياً مسبقاً إلى "عدم استخدام ملفات الرأس المترجمة برمجياً مسبقاً".)

ومع ذلك، فإن المشاريع الكبيرة خاصة، توفر لها ملفات الرأس المترجمة برمجياً مسبقاً سرعة تحويل برمجي أفضل كثيرا, لذلك فإن تعطيل هذه الميزة غير مطلوب. في هذه الحالة من الأفضل تكوين الملفات /clr و الغير /clr لاستخدام رؤوس مترجمة برمجياً مسبقاً منفصلة . يمكن القيام بذلك في خطوة واحدة بواسطة تحديد متعدد للنماذج ليتم ترجمتها /clr باستخدام مستكشف الحلول, و النقر بزر الماوس الأيمن فوق المجموعة، ثم تحديد خصائص. قم بتغيير كلا من PCH إنشاء/استخدام خلال "خصائص الملف و ملفات الرأس المترجمة برمجياً مسبقاً" لاستخدام اسم ملف رأس و ملف PCH مختلفين بالترتيب.

إصلاح الأخطاء

الترجمة البرمجية بـ /clr قد تنتج أخطاء فى برنامج التحويل البرمجي أو الرابط أو وقت التشغيل. يناقش هذا القسم المشاكل الأكثر شيوعاً.

دمج بيانات التعريف

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

حالة توقف تام لقفل أداة التحميل

في Visual C++ .NET 2003 Visual C++ ، التهيئة ضمن /clr كانت عرضة لحالة توقف تام غير محددة . هذه المشكلة تُعرف باسم " حالة التوقف التام لقفل أداة التحميل ". في Vهوual Studio 2010, th هو حالة توقف تام هو من السهل تجنب، فإنه هو الكشف عنها والتي تم إرسالها في وقت التشغيل، و هو non-determinهوtic لم تعد. و بالرغم من أن مشكلة قفل أداة التحميل مازالت ممكنة، إلا أن تجنبها وإصلاحها صار الآن أسهل بكثير. راجع تهيئة التجميعات المختلطة لخلفية مفصلة و إرشادات و حلول.

تصدير البيانات

تصدير بيانات DLL عرض للخطأ و لا ينصح به. ويرجع السبب إلى أن مقطع البيانات من DLL لا يُضمن أن تتم تهيئته حتى يتم تنفيذ بعض أجزاء DLL المدارة. ارجع إلى بيانات التعريف بـ The #using Directive.

رؤية النوع

الأنواع الأصلية الآن خاصة بشكل افتراضي. في Visual C++ .NET 2002 وVisual C++ 2003 ، الأنواع الأصلية كانت عامة بشكل افتراضي. يمكن أن يؤدي هذا إلى أن يكون النوع الأصلي غير مرئي خارج DLL. حل هذا الخطأ عن طريق إضافة public إلى هذه الأنواع. لمزيد من المعلومات، راجع Type and Member Visibility.

الفاصلة العائم و مشاكل المحاذاة

__controlfp غير معتمدة على وقت تشغيل اللغة الشائعة (راجع _control87 _controlfp ، __control87_2 للحصول على مزيد من المعلومات). CLR أيضاً لن تعتبر align (C++).

تهيئة COM.

وقت تشغيل اللغة العامة يهيئ COM تلقائياً عند تهيئة وحدة التحكم النمطية (عند تهيئة COM تلقائياً، فإنه قام بذلك كـ MTA). نتيجة لذلك, فإن تهيئة COM بشكل صريح يعطي تعليمات برمجية مرجعة تشير إلى تهيئة COM بالفعل. محاولة تهيئة COM بشكل صريح بواسطة نموذج مؤشر ترابط واحد بعدما قام CLR بتهيئة COM بالفعل إلى نموذج مؤشر ترابط آخر يمكن أن يؤدي إلى فشل التطبيق الخاص بك.

وقت تشغيل اللغة العامة يبدأ COM كـ MTA افتراضياً; استخدام / CLRTHREADATTRIBUTE (مؤشر الترابط CLR تعيين سمة) لتعديل هذا.

مشكلات الأداء

قد ترى أداءً منخفضاً عندما يتم استدعاء أساليب C++ الأصلية التي تم إنشاؤها لـ MSIL بشكل غير مباشر (استدعاءات الدالات الظاهرية أو استخدام مؤشرات الدالة). لمعرفة المزيد حول هذا، راجع:تنفيذ مزدوج للتعليمة البرمجية للتحويل (C++)

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

تعطل البرامج عند إيقاف التشغيل

في بعض الحالات، يمكن أن تقوم CLR بإيقاف التشغيل قبل انتهاء تشغيل التعليمات البرمجية المدارة الخاص بك. استخدام std::set_terminate و SIGTERM يمكن أن يؤدي هذا. لمزيد من المعلومات، راجع إشارة الثوابت و set_terminate (@) .

استخدام ميزات Visual C++ الجديدة

بعد التحويل البرمجى للتطبيق الخاص بك و الارتباطات و التشغيل، يمكنك بدء استخدام ميزات .NET في أية وحدة نمطية مترجمة برمجياً مع /clr. لمزيد من المعلومات، راجع Language Features for Targeting the CLR.

إذا كنت تستخدم ملحقات مدارة لـ C++، يمكنك تحويل التعليمات البرمجية الخاصة بك لاستخدام بناء الجملة جديد. للحصول على خلاصة اختلافات بناء الجملة، راجع ترقية ملحقات المدارة لـ C++ بناء قائمة اختيار. للحصول على تفاصيل حول تحويل الملحقات المدارة لـ C++ ، راجع ‏‫تمهيد ترحيل C++/CLI.

للحصول على معلومات حول برمجة .NET في Visual C++ راجع:

راجع أيضًا:

المبادئ

تجميعات مختلطة (أصلية و مدارة)