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

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

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

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

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL
20.08.2008 20:39:36
5 ОТВЕТОВ
РЕШЕНИЕ

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

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


    public enum eDeviceIntErrCodes 
    {
        /// eDEVICEINT_ERR_FATAL -> 0x10001
        eDEVICEINT_ERR_FATAL = 65537,
    }
12
20.08.2008 20:45:28

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

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

2
20.08.2008 20:42:17

Если вы объявили перечисление как:

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;
0
20.08.2008 20:51:23

В C / C ++ вы можете #include файл .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 ++ такого определения препроцессора не существует.

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

12
20.08.2008 21:16:33

Если вы определите сильное перечисление в C ++ / CLI, коды перечисления будут включены в метаданные dll. Таким образом, вы можете использовать коды перечисления в C #.

public enum class eDeviceIntErrCodes: int
{
    eDEVICEINT_ERR_FATAL = 0x10001
    ...
};
0
1.08.2018 10:38:37