Как использовать библиотеки DLL C в C#?
Я разработал библиотеку dll для конкретных вычислений с помощью matlab и скомпилировал ее с помощью mcc.
Одна из функций библиотеки DLL использует указатель на записи в качестве типов результатов. Это прекрасно работает с delphi/pascal, создающими записи с теми же типами полей, что и в C-коде dll. Для интерфейса DLL, я использую указатель на эту запись.
C внедрение моей записи результатов
struct TRecordField { char Key[100]; byte TypID; int ElemSize; int Rows, Cols; void *Buffer; };
Теперь я пытаюсь использовать ту же самую dll в C#. Адрес моих записей результатов присваивается dll-функции getResults с оператором &, как в приведенном ниже фрагменте кода.
Только массив символов 'Key' (представленный в виде массива байтов в C#) записей корректно заполняется после вызова dll, числа (типа int или byte) всегда равны нулю.
Объявление функции Dll C#
unsafe public static extern int getResults(TRecordField* Root);
Реализация структуры C#
"
[StructLayout(LayoutKind.Sequential)] unsafe public struct TRecordField { public fixed byte Key[100]; // --> this one is filled correct with chars from a // string public byte TypId; // all other values remain 0 public int Elemsize; public int Rows, Cols; public void* Buffer; } TRecordField Root;
Вызов функции C#
int Erg = NativeMethods.getResults(&Root);
Что я уже пробовал:
Я пробовал некоторые вещи, такие как "
[StructLayout(LayoutKind.Sequential)]
" и "[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- но это не сработало.
Gerry Schmitz
Измените порядок полей в записи.