Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Импорт перечислений C++ в C#
В настоящее время я работаю над созданием нового проекта C#, который должен взаимодействовать со старым приложением C++. Существует перечисление ошибок, которое уже существует в приложении C++, которое мне нужно использовать в приложении C#.
Я не хочу просто повторно объявлять перечисление в C#, потому что это может вызвать проблемы синхронизации вниз по строке, если файлы не обновляются вместе .
Все что было сказано мой вопрос заключается в следующем: Есть ли способ для меня сделать перечисление объявленным так:
typedef enum
{
eDEVICEINT_ERR_FATAL = 0x10001
...
} eDeviceIntErrCodes;
и использовать его в программе C# вот так:
eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL
Проверьте 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,
}
В 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 двоичных файла из разных сборок, гарантия не выполняется.
Если бы вы объявили перечисление как:
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;