Сведения о вопросе

Gaukhar

16:58, 25th August, 2020

Теги

c#   c++    

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

Просмотров: 423   Ответов: 5

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

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

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

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL



  Сведения об ответе

FAriza

16:57, 27th August, 2020

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

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


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


  Сведения об ответе

piter

18:18, 8th August, 2020

В 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++ нет такого определения препроцессора.

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


  Сведения об ответе

ЯЯ__4

18:54, 4th August, 2020

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

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


  Сведения об ответе

DAAA

18:16, 26th August, 2020

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

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;


  Сведения об ответе

LIZA

19:16, 25th August, 2020

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

public enum class eDeviceIntErrCodes: int
{
    eDEVICEINT_ERR_FATAL = 0x10001
    ...
};


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться