Импортирование перечислений С++ в С#

В настоящее время я работаю над созданием нового проекта С#, который должен взаимодействовать со старым С++-приложением. Существует перечисление ошибок, которое уже существует в приложении С++, которое мне нужно использовать в приложении С#.

Я не хочу просто объявлять перечисление в С#, потому что это может вызвать проблемы с синхронизацией вниз, если файлы не обновляются вместе.

Все, что я сказал, мой вопрос таков: Есть ли способ для меня сделать перечисление, объявленное так:

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

и использовать его в программе на С# так:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL

Ответы

Ответ 1

Проверьте инструмент PInvoke Interop Assistant http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. Это полезный инструмент для генерации сигнатур PInvoke для собственных методов.

Если я напишу его, вы перечислите его. Имеется версия командной строки для инструмента командной строки, поэтому вы можете создать автоматизированный процесс, чтобы обновить определение перечисления С# при изменении версии С++.


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

Ответ 2

В C/С++ вы можете # включить файл .cs, который содержит определение перечисления. Тщательное использование директив препроцессора учитывает различия в синтаксисе между С# и 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

В вашем проекте С# задайте условный символ компиляции "CSharp", убедитесь, что такое определение препроцессора не существует в среде сборки C/С++.

Обратите внимание, что это обеспечит синхронизацию обеих частей во время сборки. Если вы смешиваете и сопоставляете двоичные файлы из разных сборок, гарантия не работает.

Ответ 3

Простой ответ - нет. Извините, вам придется повторно объявить.

В прошлом, однако, я написал сценарии для импорта своих С++-перечислений в формат С# в файле enums.cs и запускал его как часть сборки, так что все синхронизирует.

Ответ 4

Если вы указали enum как:

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

и в другом файле:

DEVICE_ERR_CODES eDeviceIntErrCodes;

и назвал файл enum расширением .cs, вы можете заставить его работать. Вы ссылаетесь на него так:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;