При работе с двойными указателями (**
) лучше всего просто маршалировать их как 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>();