سؤال

أرغب في الاتصال بمكتبات C++ غير المُدارة من كود C# الخاص بي.ما هي المخاطر المحتملة والاحتياطات التي يجب اتخاذها؟شكرا لك على وقتك.

هل كانت مفيدة؟

المحلول

هذا السؤال واسع جدًا.الإجابة المعقولة الوحيدة هي P/Invoc، ولكن هذا يشبه قول أنك إذا كنت تريد البرمجة لنظام Windows، فأنت بحاجة إلى معرفة Win32 API.

تمت كتابة كتب كاملة تقريبًا حول P/Invoc (http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X)، وبالطبع تم إنشاء مواقع ويب كاملة: http://www.pinvoc.net/.

نصائح أخرى

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

الطريق الآخر الذي يجب اتباعه هو جعل C ++ غير المُدارة ينفذ فئات COM ويجعل C # يستخدمها عبر تجميع التشغيل المتداخل الذي تم إنشاؤه تلقائيًا.هذه الطريقة أسهل إذا كنت تعرف طريقك نحو COM جيدًا بما فيه الكفاية.

أتمنى أن يساعدك هذا.

أنت تصف P/Invoc.وهذا يعني أن مكتبة C++ الخاصة بك ستحتاج إلى الكشف عن نفسها عبر واجهة DLL، ويجب أن تكون الواجهة بسيطة بما يكفي لوصفها لـ P/Invoc عبر سمات الاستدعاء.عندما تتصل التعليمات البرمجية المُدارة بالعالم غير المُدار، يجب تنظيم المعلمات، لذلك يبدو أنه قد يكون هناك انخفاض طفيف في الأداء، ولكن سيتعين عليك إجراء بعض الاختبارات لمعرفة ما إذا كان التنظيم مهمًا أم لا.

أسهل طريقة للبدء هي التأكد من عرض جميع وظائف C++ كوظائف نمط "C".تأكد من إعلان الوظيفة كـ _stdcall.

خارجي "C" __declspec(dllexport) int _stdcall Foo(int a)

تأكد من حصولك على التنظيم الصحيح، وخاصة أشياء مثل المؤشرات & wchar_t *.إذا أخطأت في ذلك، فقد يكون من الصعب تصحيح الأخطاء.

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

يتطلب الحصول على مزيد من التحديد سؤالاً أكثر تحديدًا.

يمكنك أيضًا الاتصال بالرمز غير المُدار عبر P/Invoc.قد يكون هذا أسهل إذا كان الكود الخاص بك لا يستخدم COM حاليًا.أعتقد أنك ربما تحتاج إلى كتابة بعض نقاط التصدير المحددة في التعليمات البرمجية الخاصة بك باستخدام الارتباطات "C" إذا سلكت هذا الطريق.

ربما يكون أكبر شيء يجب عليك الانتباه إليه في تجربتي هو أن الافتقار إلى مجموعة القمامة الحتمية يعني أن أدوات التدمير الخاصة بك لن تعمل عندما كنت تعتقد أنها ستفعل ذلك سابقًا.يجب أن تضع ذلك في الاعتبار وأن تستخدم IDisposable أو طريقة أخرى للتأكد من تنظيف التعليمات البرمجية المُدارة عندما تريد ذلك.

بالطبع، يوجد دائمًا PInvoce هناك أيضًا إذا قمت بتعبئة التعليمات البرمجية الخاصة بك على هيئة ملفات DLL مع نقاط دخول خارجية.لا يوجد أي من الخيارات خالية من الألم.إنها تعتمد على أ) مهارتك في كتابة أغلفة COM أو Managed C ب) تغيير ذراعك في PInvoc.

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

إنه مشروع يتم صيانته جيدًا ويبني بشكل فعال غلافًا رفيعًا حول مكتبة C++ الخاصة بك والذي يمكن أن يسمح للغات مثل C# بالتواصل مباشرة مع التعليمات البرمجية الأصلية الخاصة بك - مما يوفر عليك مشكلة الاضطرار إلى تنفيذ (وتصحيح) تعليمات برمجية لاصقة.

إذا كنت تريد أمثلة PInvoc جيدة يمكنك الاطلاع عليها PInvoc.net.يحتوي على أمثلة لكيفية استدعاء معظم وظائف win api.

كما يمكنك استخدام الأداة من هذه المقالة كلير من الداخل إلى الخارج:استدعاء سيؤدي ذلك إلى ترجمة ملف .h الخاص بك إلى غلافات c#.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top