Импортирование перечислений С++ в С#
В настоящее время я работаю над созданием нового проекта С#, который должен взаимодействовать со старым С++-приложением. Существует перечисление ошибок, которое уже существует в приложении С++, которое мне нужно использовать в приложении С#.
Я не хочу просто объявлять перечисление в С#, потому что это может вызвать проблемы с синхронизацией вниз, если файлы не обновляются вместе.
Все, что я сказал, мой вопрос таков:
Есть ли способ для меня сделать перечисление, объявленное так:
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;