سؤال

أحتاج إلى إنشاء مكتبة c++ كبيرة متاحة للاستخدام في لغات .Net مثل C#.

تحتوي المكتبة على عدد كبير من الفصول التي يمكن تقسيمها إلى مجموعتين.فئات معدودة مرجعية، والتي تنفذ فئة مجردة IRefCounted وتستخدم طريقة المصنع لإنشائها، وفئات عادية فقط باستخدام جديد/حذف.

بالإضافة إلى ذلك هناك العديد من الوظائف البسيطة.

في الأصل كنت سأكتب دروسًا مجمعة لكل شيء في c++/clr.ومع ذلك فمن المرغوب فيه أن تعمل مكتبات المجمع الناتجة على Mono.تعد إعادة ترجمة المكتبة والمجمّع لاستهداف كل نظام أساسي أمرًا جيدًا، ولكن المشكلة تكمن في أنه يبدو أن c++/clr يمكنه استهداف النوافذ فقط لأنه لا يوجد مترجم له لاستهداف الأنظمة الأساسية الأخرى، وبالتالي لن يعمل رمز المجمع على أنظمة أخرى. ..

هل هناك شيء فاتني هنا (مثل كيفية تشغيل دليل c++/clr على النظام الأساسي x) أم أن هناك طريقة بديلة لجعل جميع وظائف c++ والبنيات والفئات متاحة لـ C#؟

يحرر:أعني بالمتاح أنه متاح للاستخدام، على سبيل المثال، في c++ lib الذي أملكه

//namespace maths{
class Vector2
{
public:
    float x,y;
    Vector2();
    Vector2(const Vector&);
    Vector2(float x, float y);
    float Dot();
    //operators
    ...
};

ثم في C# id ترغب في أن تكون قادرًا على استخدامه مثل الفصل العادي على سبيل المثال

maths::Vector2 a = new maths::Vector2(5, 5);
maths::Vector2 b = new maths::Vector2(1, 10);
b *= 3
maths::Vector2 c = a + b;
//c.x == 8, c.y == 35

ومع ذلك، فأنا لا أستطيع تحرير مكتبة c++، ويجب القيام بأي شيء كغلاف حول الفئات والوظائف الموجودة.

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

المحلول

تعد أغلفة C++/CLI بالتأكيد الخيار الأفضل إذا كنت تستهدف Windows فقط.إنها تؤدي أداءً جيدًا جدًا، ومن السهل جدًا كتابتها وصيانتها، وما إلى ذلك.ولكن كما قلت، هذا لن يعمل على مونو.تكمن المشكلة في أن التجميع الذي تم إنشاؤه ليس تجميعًا clr:pure، ولكنه تجميع يحتوي على كود أصلي ورمز IL مختلط، لذلك لن يعمل خارج Windows.بالإضافة إلى ذلك، تحتاج إلى إنشاء تجميعات منفصلة في C++/CLI لأهداف x86 وx64، إذا كنت ستستهدف أنظمة 64 بت.

SWIG هو بالتأكيد خيار.يمكنه التعامل مع جميع تعقيدات تغليف فئة C++، ولكن عندما تصل إلى مشكلات أكثر تعقيدًا، يتعين عليك عادةً إجراء بعض التغيير والتبديل.

أوصي بمراجعة موقع SWIG الرئيسي, ، وخاصة بهم قسم #C.

للحصول على أمثلة جيدة لاستخدام SWIG لتغليف مكتبة معقدة للغاية، راجع ذلك اوجري دوت نت (ميت تقريبًا، لكنه لا يزال مثالًا جيدًا) أو جيدال.مما أتذكره، كلاهما لهما معالجة خاصة للميزات المحددة لـ C#، ويتعاملان مع الفئات المُعدة المرجعية، والتعدادات، وما إلى ذلك.

الشيء الجميل الآخر في SWIG - إذا قمت بإنشاء أغلفة SWIG، فمن السهل جدًا توسيعها إلى لغات أخرى إذا كنت بحاجة إلى ذلك.بمجرد حصولك على الأغلفة، يصبح من السهل إنشاء أغلفة Java وpython وRuby وما إلى ذلك.

نصائح أخرى

إستعملت جرعة كبيرة لقد كان تغليف بعض أكواد C++ واستدعاءها من mono أمرًا رائعًا.

إذا كنت تعني إتاحة إمكانية التحرير، فيمكنك تنفيذ نظام انعكاس يحركه القالب/الماكرو في C++ وإنشاء غلاف لـ C# وMono فوق ذلك.للحصول على فكرة حول كيفية تنفيذ ذلك، يمكنك إلقاء نظرة على

DECLARE_DYNAMIC

و

RUNTIME_CLASS

وحدات الماكرو في MFC و

IcustomTypeDescriptor

الواجهة في لغة C#.

بعض الكتب في سلسلة Game Programming Gems تتناول هذا الموضوع أيضًا.

ومن ناحية أخرى، إذا كنت تقصد الإتاحة للبرمجة، فمن الواضح أنه سيتعين عليك تزويد المبرمج بجميع الأنواع التي من المفترض أن يعمل بها، أي.عليك أن تغلفهم.

بقدر ما أفهم، Mono عبارة عن جهاز افتراضي قادر على تنفيذ كود البايت الذي ينتجه CLR (وغيرها)، لذا فإن ثنائيات C# هي كل ما تحتاجه.

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