هل من الممكن مشاركة إعلان Enum بين C # و C ++ غير المدمن؟

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

سؤال

هل هناك طريقة لمشاركة تعريف العادة بين المواطنين (غير المدار) C ++ و (إدارة) C #؟

لدي المعمنة التالية المستخدمة في التعليمات البرمجية غير المدارة بالكامل:

enum MyEnum { myVal1, myVal2 };

تطبيقنا يستخدم في بعض الأحيان مكون مدار. أن مكون C # يحصل على قيم عنصر ENUM ك Intts عبر DLL المدارة C ++ Interop (من DLL الأصلي). (يتم تحميل DLL Interop فقط إذا كان مكون C # مطلوبا.) يكرر مكون C # تعريف ENUM:

public enum MyEnum { myVal1, myVal2 };

هل هناك طريقة للقضاء على الازدواجية دون تحويل DLL C ++ الأصلي إلى DLL المدارة؟

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

المحلول

يمكنك استخدام ملف .cs واحد ومشاركتها بين المشروعتين. #include في C ++ على ملف .cs يجب أن يكون مشكلة.

سيكون هذا مثالا ملف .cs:

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };

#if !__LINE__
}
#endif

إذا كنت تريد عددا متعددة في ملف واحد، فيمكنك القيام بذلك (على الرغم من أنه يجب عليك تحديد الجمهور مؤقتا أنه لا يوجد شيء ل C / C ++):

#if __LINE__
#define public
#else
namespace MyNamespace
{
#endif

    public enum MyEnum { MyEnumValue1, MyEnumValue2 };
    public enum MyEnum2 { MyEnum2Value1, MyEnum2Value2 };
    public enum MyEnum3 { MyEnum3Value1, MyEnum3Value2 };

#if __LINE__
#undef public
#else
}
#endif

نصائح أخرى

شكرا للمشاركة!

لقد لعبت حول بعض الشيء ووجدت طريقة للحصول على تصريحات عودة متعددة وغير ثابتة دون وجود طن من الخطوط الإضافية :)

// This is a valid C, C++ and C# file :)
#if __LINE__
#define public
#else
namespace MyCSharpNamespace{
#endif

    public enum MyConstant { MaxStr = 256 };
    public enum MyEnum1{ MyEnum1_A, MyEnum1_B };
    public enum MyEnum2{ MyEnum2_A, MyEnum2_B };

#if __LINE__
#undef public
#else
}
#endif

تذكر تسمية ملفك * .cs

يمكنك عرض مكتبة C # ل COM ثم استيراد مكتبة النوع إلى التعليمات البرمجية غير المدارة - وبهذه الطريقة ستتمكن من استخدام Enum المحدد في مكتبة C # في المكتبة غير المدارة.

يعيش بشكل غير مدار C ++ و C # في عالمين مختلفين، لذلك لا توجد وسيلة لاستخدام نفس ENIN، دون تغيير DLL C ++ في واحدة مدارة.

وحتى بعد ذلك، ربما كنت بحاجة إلى الازدواجية في DLL C ++ المدارة.

يشبه ENUM C ++ إلى حد كبير قائمة الثوابت، في حين أن Enum C # يرث فئة ENUM، وبالتالي يوفر عدد قليل جدا من "الحيل". حتى ترى، انهم جدا مختلف.

إذا لم يهم الأمر ما إذا كان DLL C ++ الأصلي الأصلي أو يديره، فسأقله إلى واحدة مدارة ولف المكالمات الأصلية داخل طبقة C ++ المدارة.

بهذه الطريقة يمكنك أن يكون لديك ازدواجية Enum داخل DLL C ++، وأيضا يمكنك التخلص من جميع Interop في نفس الوقت :-)

لقد تلقيت نفس المشكلة في الماضي وحلها باستخدام تعريفات مسبقا.

في التعليمات البرمجية غير المدارة، داخل رأس يمكن إدراجه أيضا من خلال التفاف المدار الخاص بك، ضع عناصر التعداد الخاصة بك في #Define.

بعد ذلك، في تعريفات التعداد المدار وغير المدار، استخدم نفس #Define لكل من الكلمان.

تبدو حركة التعدادات بين العالم المداري وغير المداري وغير المداري بشكل طفيف (هناك حاجة ملحة بشكل أساسي)، ولكن على المتصل الخاص بك في العالم غير المدار، ستبدو وتشعر بخير.

حظ سعيد،

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