如何将已分配的内存块转换为数组可寻址数据类型。

时间:2014-01-01 23:29:09

标签: c# pointers casting pinvoke

我正在尝试将c#中的一些数据编组到c库中。我需要传递的结构只是一个指针集合......类似于:

struct sometype {
    type1* element1;
    type2** element2;
    type3** element3;
    type4* element4;
}

现在......我选择放弃尝试将所有这些类型复制到c#中并将它们编组为结构,并决定用正确的顺序用正确的数据填充IntPtr数组并将其作为指针传递。正如你所看到的,在这个设置中,我传递了一个4位置的指针数组,其中位置1和2是指针本身的数组。这很简单,当我通过修复IntPtr数组进行编组时确实可以工作......


fixed(IntPtr* ptr = structArray){
    InteropCall(ptr);
}

然而,我很快意识到c库实际上是保留了对结构的引用,并且在某个时候,预期会在移动或收集数组时中断。所以我的解决方案是使用Marshal.AllocHGlobal分配一块内存,并在c库需要该数据的整个过程中保持引用。

所以我运行这个:

IntPtr* pointerArray = (IntPtr*)Marshal.AllocHGlobal (IntPtr.Size * 4);

然而,pointerArray总是出现IntPtr.Zero ...或者我猜...只是零。

我做错了什么?我可以不将内存块转换为指针数据类型吗?如果我想要byte*int*以便我可以像数组一样对内存块进行操作,该怎么办?

0 个答案:

没有答案