我有一个C ++ DLL,它具有从设备发送数据的功能。从我的托管C#代码我调用C ++函数positionCallback。请注意这个位置。 pos根据定义 - 是三个指针的数组,指向位置数组。
public void positionCallback(uint devNo,uint count,uint index,ref System.IntPtr pos,ref System.IntPtr mrk)
现在我的问题是我要提取这三个数组中的每一个的数据,但我只能得到数组1的数据,而对于休息2,我得到了垃圾值。 以下是我正在尝试的代码
// Copy the unmanaged array to managed memory for Axis 2
IntPtr ptr2 = IntPtr.Add(pos,2*sizeof(Int64));
Marshal.Copy(pos,managedArrayAxis1,0,(int)count);
// Copy the unmanaged array to managed memory for Axis 2
Marshal.Copy(ptr2, managedArrayAxis2, 0, (int)count);
上面的代码仅为managedArrayAxis1提供了正确的数据,但对于managedArrayAxis2,正在收集垃圾数据。我错误地增加了pos的IntPtr地址吗?
请帮忙!
答案 0 :(得分:2)
pos
参数实际上是指向双数组指针数组的指针,因此您需要将其取消引用两次。您的代码发生的是ref
自动解除指向指针数组的指针,但您在pos
中得到的只是3个二级指针中的第一个指针,无法进入另外两个。
要获取原始指针,您需要删除ref
参数上的pos
关键字。然后将pos
指向的数据复制到IntPtr
的数组中,您将不需要任何指针算法:
public void positionCallback(uint devNo,uint count,uint index,System.IntPtr pos,ref System.IntPtr mrk)
// copy the array of pointers
IntPtr[] arrays = new IntPtr[3];
Marshal.Copy(pos, arrays, 0, 3);
// Copy the unmanaged array to managed memory for Axis 2
Marshal.Copy(arrays[0],managedArrayAxis1,0,(int)count);
// Copy the unmanaged array to managed memory for Axis 2
Marshal.Copy(arrays[1], managedArrayAxis2, 0, (int)count);