如何从该数组中检索信息

本文关键字:检索 信息 数组 | 更新日期: 2023-09-27 18:23:52

我有一个IntPtr指向另一个指向非托管数组的IntPtr。我想知道如何将此非托管数组复制到托管数组?我知道我必须使用Marshal.Copy,但当我有一个指向指针的指针时,我不确定如何使用它。

这是我的示例代码

非托管C++:

void foo(Unsigned_16_Type**  Buffer_Pointer);

托管C#:

[DllImport("example.dll")]
        public static extern void foo(IntPtr Buffer_Pointer);
//...
//...
int[] bufferArray = new int[32];

IntPtr p_Buffer = (IntPtr)Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * bufferArray.Length);
Marshal.Copy(bufferArray, 0, p_Buffer, bufferArray.Length);
GCHandle handle = GCHandle.Alloc(p_Buffer, GCHandleType.Pinned);
IntPtr ppUnmanagedBuffer = (IntPtr)handle.AddrOfPinnedObject();
//Call to foo
foo(ppUnmanagedBuffer);

因此,现在我在ppUnmanagedBuffer中有一个IntPtr到一个IntPtr到数组,但我不确定如何使用Marshal将该数组复制到新的托管数组。copy

我试过类似的东西

int[] arrayRes = new int[word_count];
Marshal.Copy(ppUnmanagedBuffer, arrayRes, 0, word_count);

但这不起作用

如何从该数组中检索信息

剩下的就是"撤消"以下调用,使ppUnmanagedBuffer指向您期望的数据类型:

GCHandle handle = GCHandle.Alloc(p_Buffer, GCHandleType.Pinned);

IntPtr ppUnmanagedBuffer = (IntPtr)handle.AddrOfPinnedObject();

如果C#已经通过这种机制为您提供了int**的等价物,那么您需要取消引用它一次,以获得int[]的等价物

Marshal.Copy((IntPtr)(GCHandle.FromIntPtr(ppUnmanagedBuffer).target), arrayRes, 0, word_count);

(语法可能有点偏离,但这是一般的想法…)