كيفية استخدام وحدة C++ من تطبيق Mono
-
05-07-2019 - |
سؤال
أحاول تشغيل تطبيق C#/C++ على Linux بعد تطويره على Windows.
جزء صغير منه، FooLib، مكتوب بلغة C++ والذي يتم استدعاؤه من C# للأداء.لا يستخدم FooLib أي استدعاءات للنظام، بل يستخدم وظائف C++ القياسية فقط.يقوم بتصدير دالة واحدة، تم تعريفها على النحو التالي:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
لقد تم تجميعه باستخدام Visual C++.لقد حاولت تشغيل التطبيق ضمن برنامج mono باستخدام FooLib.dll المترجم على نظام Windows، ولكن فشل تحميل dll (DllImport) مع:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
اذا ماذا يجب أن أفعل؟
- هل تريد تغيير بيان التصدير بطريقة ما؟
- قم بتجميع الشيء في مكتبة .so باستخدام gcc على Linux، ثم قم بتحميله؟
- قم بترجمته إلى ملف .dll مع gcc على Linux، ثم قم بتحميله؟
- شيء آخر؟
المحلول
تحتاج إلى إعادة ترجمة مكتبتك على نظام Linux، وستحصل على ملف foolib.so.ثم عليك إنشاء DllMap (تحقق من هذا الرابط) حتى لا تضطر إلى تحديد اسم مكتبة *.so لنظام التشغيل Linux في كود C# الخاص بك وملف *.dll منفصل لنظام التشغيل Windows - وهذه مجرد طريقة لتعيين اسم المكتبة بشكل ملائم اعتمادًا على نظام التشغيل.
نصائح أخرى
أداة رائعة جدًا لأتمتة الارتباطات الأصلية هي SWIG.http://www.swig.org/
أتفق مع التعليق الأول.يجب أن يعمل كود .NET الخاص بك بشكل جيد على Linux دون أي إعادة ترجمة، ولكن يجب أن يتم تجميع استدعاءك الأصلي محليًا.