Импорт перечислений C ++ в C # - PullRequest
15 голосов
/ 21 августа 2008

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

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

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

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL

Ответы [ 5 ]

12 голосов
/ 21 августа 2008

В 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 голосов
/ 21 августа 2008

Ознакомьтесь с инструментом 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,
    }
2 голосов
/ 21 августа 2008

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

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

0 голосов
/ 01 августа 2018

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

public enum class eDeviceIntErrCodes: int
{
    eDEVICEINT_ERR_FATAL = 0x10001
    ...
};
0 голосов
/ 21 августа 2008

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...