tldr;
Решением было просто изменить DllImport для импорта fibonacci_next () на:
[DllImport("MathLibrary.dll", CallingConvention = CallingConvention.Cdecl))]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool fibonacci_next();
Немного дополнительно:
Технически это было все, что было необходимо для ответа на этот вопрос. Для тех, кто нашел этот вопрос в аналогичных терминах, я добавляю немного больше информации ниже, поскольку реальная точка зрения вопроса была больше о понимании и изучении, а не о копировании и вставке кода других людей и попытке заставить его работать.
Начиная с комментария GSerg:
C ++ bool - это не C # bool. UnmanagedType.Bool - это COOL BOOL, а не bool.
Я использовал этот список при преобразовании типов данных:
Таблица ниже взята из Преобразование типов данных C ++ в C # (я уверен, что есть более официальные схемы преобразования)
C++ Type C# Type Size
-------- ------- ----
BOOL bool 1 byte
BYTE byte 1 byte
CHAR byte 1 byte
DECIMAL Decimal 16 bytes
DOUBLE double 8 bytes
DWORD uint, UInt32 4 bytes
FLOAT float, single 4 bytes
INT, signed int int, Int32 4 bytes
INT16, signed short int short, Int16 2 bytes
INT32, signed int int, Int32 4 bytes
INT64 long, Int64 8 bytes
LONG int, Int32 4 bytes
LONG32, signed int int, Int32 4 bytes
LONG64 long, Int64 8 bytes
LONGLONG long, Int64 8 bytes
SHORT, signed short int short, Int16 2 bytes
UCHAR, unsigned char byte 1 byte
UINT, unsigned int uint, UInt32 4 bytes
UINT16, WORD ushort, UInt16 2 bytes
UINT32, unsigned int uint, UInt32 4 bytes
UINT64 ulong, UInt64 8 bytes
ULONG, unsigned long uint, UInt32 4 bytes
ULONG32 uint, UInt32 4 bytes
ULONG64 ulong, UInt64 8 bytes
ULONGLONG ulong, UInt64 8 bytes
WORD ushort 2 bytes
void*, pointers IntPtr x86=4 bytes, x64=8 bytes
Поскольку я только начинаю немного изучать C ++, я сделал предположение, что (c ++) BOOL в приведенном выше списке эквивалентен (c ++) bool, и когда не было [return: MarshalAs(UnmanagedType.Bool)]
с ошибкой, я попытался добавить это , что также не удалось.
Краткое примечание для получения дополнительной информации о UnmanagedTypes см. Microsoft: UnmanagedType Enum :
UnmanagedType.I1 : 1-байтовое целое число со знаком. Вы можете использовать этот элемент для преобразования логического значения в 1-байтовый тип bool в стиле C (true = 1, false = 0).
Еще один бит, который мне понравился, был в принятом решении https://stackoverflow.com/a/32115697/716296, которое не совсем относится к этому вопросу, так как я на самом деле не пытался изменить сторону вещей в c ++, а использовал его как базовый фрагмент кода, чтобы узнать, как вещи сочетаются друг с другом.
Также возможно использовать аргумент ref вместо возвращаемого значения.
На самом деле это общая схема в неуправляемом взаимодействии:
Я видел, как этот "общий шаблон" довольно часто используется при работе со сторонними инструментами, которые оборачивают неуправляемые библиотеки. Конечно, если я пишу свои собственные неуправляемые библиотеки dll / библиотеки, я напишу их так, чтобы они наилучшим образом соответствовали их назначению и использованию, в отличие от исходного вопроса, который был всего лишь инструментом для начала изучения.
Я надеюсь, что этот ответ поможет нескольким людям (я ужасен в терминологии), но вопрос был довольно базовым, и я не только получил ответ, но и нашел несколько хороших ссылок для расширения сейчас.