Meb56 Ответов: 0

Как использовать библиотеки 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

Измените порядок полей в записи.

0 Ответов