Как собрать массив структур в C #? - PullRequest
8 голосов
/ 08 апреля 2009

У меня есть следующая структура в C #:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RECORD
{
    public uint m1;
    public uint m2;
    public uint m3;
}

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

[DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt(RECORD[] dataRecord);

но я не получаю никаких данных. Я уже пробовал PInvoke Interop Assistant. Должен ли я использовать IntPtr здесь? Есть идеи?

Edit:

Вот код C # для вызова нативной функции:

RECORD[] rec = new RECORD[256];
doIt(rec);
// values of rec are all zero here

Вот функция C:

int doIt(RECORD* rec)
{
    // deref pointer and write some data
}

1 Ответ

14 голосов
/ 08 апреля 2009

Я далеко не эксперт P / Invoke, но мне интересно, может ли помочь сделать это параметром in / out:

DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt([In, Out] RECORD[] dataRecord);

Я бы не ожидал ожидаемого , что, как и в случае с LayoutKind.Sequential, я надеюсь, что ваша структура уже является blittable типом, и что массив будет также blittable.

...