我从C ++库方法收到IntPtr
值,我需要从收到的byte[]
获取IntPtr
数组。当我尝试这样做时:
byte[] myArray = new byte[Marshal.SizeOf(myReceivedIntPtr)];
Marshal.Copy(myReceivedIntPtr, myArray, 0, Marshal.SizeOf(myReceivedIntPtr));
我收到一个例外:AccessViolationException
。
我错过了什么?
修改:
这是C ++库标题中的方法名称和参数:
int MSR_DecodeTrack(char *AscBuff, unsigned char *BinBuff, unsigned char bpc, unsigned char parity, unsigned char ss, unsigned char es);
我用C#这样称呼它:
UInt32 result;
IntPtr myReceivedIntPtr;
IntPtr BinBuff;
byte BPC1 = 7, Parity1 = 1, SS1 = 0x05, ES1 = 0x1F;
result = MSR_DecodeTrack(ref myReceivedIntPtr, ref BinBuff, BPC1, Parity1, SS1, ES1);
这是其他代码:
byte[] myArray = new byte[Marshal.SizeOf(myReceivedIntPtr)];
Marshal.Copy(myReceivedIntPtr, myArray, 0, Marshal.SizeOf(myReceivedIntPtr));
答案 0 :(得分:2)
我很确定Marshal.SizeOf(myReceivedIntPtr)
将返回IntPtr对象的大小,而不是非托管数组的大小。您需要从c ++库中获取非托管数组的大小。
我有一段时间不必这样做,所以我有点生疏,但从查看c ++标题我认为它期待一个指向缓冲区的指针。你给它一个指向指针的指针(intptr是一个指针并通过ref传递它意味着你传递c ++代码指向该指针的指针)。首先,不要使用ref。其次,我怀疑你应该传递一个已经很大的缓冲区 - 是否有任何文档描述你应该传递给函数的内容?函数的返回码是什么?你正在检查它是否成功不是吗? ;)
答案 1 :(得分:0)
名为MSR_DecodeTrack
的方法也应该返回它分配的每个数组的长度。
据我所知,当你在C / C ++环境中分配一个数组时,你得到一个指向该数组的零元素的指针,仅此而已。因此,您还应该以某种方式将已分配数组的长度返回给调用者。它可以通过额外的" ref"参数。
HTH。