我正在尝试将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*
以便我可以像数组一样对内存块进行操作,该怎么办?