DLL импорт malloc двойных косвенных указателей - PullRequest
4 голосов
/ 12 мая 2011

У меня есть функция C, которая принимает несколько аргументов двойных косвенных указателей.

как то так

int myFunction (int ** foo, int** bar, int **baz){
    int size = figureOutSizeFunction();
    *foo = (int*) malloc (sizeof(int) * size);
    return SomeOtherValue;
}

Теперь в C # я пытаюсь передать его ссылку на IntPtr, однако IntPtr всегда равен нулю. И когда я передаю эти значения следующей функции DLL C, DLL перестает работать с нарушением доступа к системе. Я знаю, что код работает только в среде C (у меня есть «main», который тестирует код), однако, он не работает при вызове из C #

Какой тип переменной мне нужен в C # для передачи в C DLL? ref ref int?

1 Ответ

4 голосов
/ 12 мая 2011

При работе с двойными указателями (**) лучше всего просто маршалировать их как IntPtr.

public static extern int myFunction(IntPtr foo, IntPtr bar, IntPtr baz);

Затем копание в двойной указатель выполняется в управляемом коде.

IntPtr foo, bar baz;
...
myFunction(foo, bar, baz); 

IntPtr oneDeep = (IntPtr)Marshal.PtrToStructure(foo, typeof(IntPtr));
int value = (int)Marshal.PtrToStructure(oneDeep, typeof(int));

Код выше, очевидно, немного ... ужасен. Я предпочитаю оборачивать это в хорошие методы расширения на IntPtr.

public static class Extensions {
  public static T Deref<T>(this IntPtr ptr) {
    return (T)Marshal.PtrToStructure(ptr, typeof(T));
  }
}

Тогда вышеприведенное можно переписать как более читаемое

int value = ptr.Deref<IntPtr>().Deref<int>();
...