سؤال

أحاول تشغيل تطبيق 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 دون أي إعادة ترجمة، ولكن يجب أن يتم تجميع استدعاءك الأصلي محليًا.

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