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


14

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

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

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

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
12

Проверьте инструмент 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

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

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


0

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

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;

12

В C/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 

В вашем C# проекта, установить условный символ компиляции «Csharp», убедитесь, что нет такого определения препроцессора не существует в среде сборки C/C++.

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