ما هي أفضل الممارسات عند استخدام SWIG مع C#؟

StackOverflow https://stackoverflow.com/questions/25268

  •  09-06-2019
  •  | 
  •  

سؤال

هل استخدم أي شخص هناك جرعة كبيرة مكتبة مع C#؟إذا كان لديك، ما هي المخاطر التي وجدتها وما هي أفضل طريقة لاستخدام المكتبة؟أفكر في استخدامه كغلاف لبرنامج تمت كتابته بلغة C وأريد تغليف ملفات الرأس حيث يمكنني استخدامها في تطبيق .NET الخاص بي.

يحرر:بعض التوضيحات حول أنظمة التشغيل المستهدفة.

أخطط لتشغيل التطبيق على Linux وWindows، ولهذا السبب أبحث في SWIG.P/Invocation ليس خيارًا.

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

المحلول

أعتقد أن الخطأ الذي ارتكبته الملصقات السابقة هو قراءة المستندات وعدم النظر إلى الأمثلة.

قبل بضع ساعات كنت بحاجة إلى ربط بعض فئات C++ بـ C#.لقد بحثت في Swig dir الخاص بي (كان لدي بالفعل لعمل آخر)، ووجدت الدليل Examples/csharp/class, ، تصفحت الكود، وحملت الحل، وحذفته، ونسخته، وأدخلت الكود الخاص بي، وقد نجح، وتمت مهمتي.

ومع ذلك، فإن كود P/Invocation الذي تم إنشاؤه ليس حلاً لجميع الاحتياجات.اعتمادًا على مشروعك، قد يكون من السهل أيضًا كتابة بعض أغلفة API البسيطة بنفسك أو كتابة لغة C++ مُدارة (ابحث عن SlimDX للحصول على مثال رائع على ذلك).

بالنسبة لاحتياجاتي، كان الأمر بسيطًا وسهلاً، لقد فعلت ذلك mystuff.dll, والآن بالإضافة إلى ذلك يمكنني الشحن mystuffnet.dll.سأوافق على أنه من الصعب الدخول إلى المستند.

يحرر:لقد لاحظت أن OP ذكر C فقط.لذلك، لا تحتاج حقًا إلى Swig، فقط استخدم بناء جملة التشغيل المتداخل C#/C المعتاد.يصبح Swig مفيدًا عندما تريد السماح له بذلك فئات C++ سيتم استدعاؤه من C#.

نصائح أخرى

بالنسبة لمشروعي الأخير، إليك ملف تكوين C# SWIG بالكامل:

%module mdProject

%{
#include "mdProject.h"
%}

لقد قمت بتجميعها في SWIG مع:

swig -csharp -c++ -I../../Include mdProject.i

أدى هذا إلى إنشاء ملف Project.cxx الذي قمت بتجميعه وربطه مباشرة بملف DLL "الرئيسي"، لذلك لم أكن بحاجة إلى ملف DLL "مساعد" ثانٍ لـ C++.قامت SWIG أيضًا بإنشاء مجموعة من ملفات C# التي قمت بتجميعها في ملف .NET DLL.تستخدم الأغلفة الأخرى (Java وPHP وما إلى ذلك) ملف DLL المساعد.

كما ذكر @patrick، يستخدم SWIG P/Invoc، لذا إذا كانت لديك مشكلة في ذلك، فستحتاج إلى إيجاد حل آخر.

إذا كنت تستخدم أنواعًا تبتعد عن المعتاد (الفراغات والهياكل وما إلى ذلك)، فسيتعين عليك القيام ببعض الأعمال الإضافية للحصول عليها بشكل صحيح، ولكن بالنسبة لواجهة برمجة التطبيقات المتوسطة التي تستخدم int's وchar*'s وما إلى ذلك، فلا بأس.

لقد حاولت استخدام SWIG لتغليف مشروع C++ لاستخدامه في .NET قبل بضع سنوات.

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

لقد انتهى بنا الأمر باستخدام Managed C++ لتغليف مشروع C++.لقد عملت بشكل جيد حقًا.

إذا كنت تقوم فقط باستدعاء وظائف مباشرة من ملف dll، فإنني أقترح عدم القلق بشأن أي مما سبق، واستخدام فقط ف/استدعاء

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