سؤال

أعمل حاليًا على إنشاء مشروع C# جديد يحتاج إلى التفاعل مع تطبيق C++ قديم.يوجد تعداد أخطاء موجود بالفعل في تطبيق C++ وأحتاج إلى استخدامه في تطبيق C#.

لا أريد فقط إعادة إعلان التعداد في C# لأن ذلك قد يسبب مشكلات في المزامنة إذا لم يتم تحديث الملفات معًا.

كل ما قيل سؤالي هو:هل هناك طريقة بالنسبة لي لإجراء تعداد مُعلن على النحو التالي:

typedef enum
{
    eDEVICEINT_ERR_FATAL = 0x10001
    ...
} eDeviceIntErrCodes;

واستخدامها في برنامج C# مثل ذلك:

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

المحلول

تحقق من أداة PInvoc Interop Assistant http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120.إنها أداة مفيدة لإنشاء توقيعات PInvoc للأساليب الأصلية.

إذا قمت بإطعامه التعداد الخاص بك فإنه يولد هذا الرمز.يوجد إصدار سطر أوامر للأداة مضمن بحيث يمكنك إنشاء عملية تلقائية للحفاظ على تعريف C# للتعداد محدثًا كلما تغير إصدار C++.


    public enum eDeviceIntErrCodes 
    {
        /// eDEVICEINT_ERR_FATAL -> 0x10001
        eDEVICEINT_ERR_FATAL = 65537,
    }

نصائح أخرى

في C/C++ يمكنك #تضمين ملف .cs الذي يحتوي على تعريف التعداد.الاستخدام الدقيق لتوجيهات المعالج المسبق يعتني بالاختلافات النحوية بين C# وC.

مثال:

#if CSharp
namespace MyNamespace.SharedEnumerations
{
public
#endif


enum MyFirstEnumeration
{
    Autodetect = -1,
    Windows2000,
    WindowsXP,
    WindowsVista,
    OSX,
    Linux,

    // Count must be last entry - is used to determine number of items in the enum
    Count
};
#if CSharp
public 
#endif

enum MessageLevel
{
    None,           // Message is ignored
    InfoMessage,    // Message is written to info port.
    InfoWarning,    // Message is written to info port and warning is issued
    Popup           // User is alerted to the message
};

#if CSharp
    public delegate void MessageEventHandler(MessageLevel level, string message);
}
#endif

في مشروع C# الخاص بك، قم بتعيين رمز الترجمة الشرطية "CSharp"، وتأكد من عدم وجود تعريف المعالج المسبق في بيئة بناء C/C++.

لاحظ أن هذا سيضمن فقط مزامنة كلا الجزأين في وقت الإنشاء.إذا قمت بخلط ومطابقة الثنائيات من إصدارات مختلفة، يفشل الضمان.

الإجابة البسيطة ستكون لا.عذرًا، سيتعين عليك إعادة التصريح.

ومع ذلك، فقد قمت في الماضي بكتابة نصوص برمجية لاستيراد تعدادات C++ الخاصة بي إلى تنسيق C# في ملف enums.cs وتشغيله كجزء من الإنشاء، وبهذه الطريقة تتم مزامنة كل شيء.

إذا كنت قد أعلنت التعداد مثل:

namespace blah
{
    enum DEVICE_ERR_CODES
    {
        eDEVICEINT_ERR_FATAL = 0x10001,
        eDEVICEINT_ERR_OTHER = 0x10002,
    };
}

وفي ملف آخر:

DEVICE_ERR_CODES eDeviceIntErrCodes;

وقمت بتسمية ملف التعداد بامتداد .cs، فقد تتمكن من تشغيله.يمكنك الرجوع إليها مثل:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

إذا قمت بتعريف التعداد القوي في C++/CLI، فسيتم تضمين رموز التعداد في بيانات تعريف dll.لذلك، يمكنك استخدام رموز التعداد في C#.

public enum class eDeviceIntErrCodes: int
{
    eDEVICEINT_ERR_FATAL = 0x10001
    ...
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top