我有一个必须将字节数组传递给 .NET 包装器的本机方法。natove 方法如下所示:
__declspec(dllexport) int WaitForData(unsigned char* pBuffer)
{
return GetData(pBuffer);
}
GetData 使用 malloc 分配内存区域并将一些数据(字节流)复制到其中。此字节流是通过套接字连接接收的。返回值是 pBuffer 的长度。
必须从 .NET 调用此方法。导入声明如下所示:
[DllImport("CommunicationProxy.dll")]
public static extern int WaitForData(IntPtr buffer);
[编辑]
dasblinkenlight 建议的 P/Invoke Interop Assistant 将原型转换为以下导入签名:
public static extern int WaitForData(System.IntPtr pBuffer)
结果是一样的:调用方法后ptr为0。
[/编辑]
调用该方法后,提取结果:
IntPtr ptr = new IntPtr();
int length = Wrapper.WaitForData(ref ptr);
byte[] buffer = new byte[length];
for(int i = 0;i<length;i++)
{
buffer[i] = System.Runtime.InteropServices.Marshal.ReadByte(ptr, i);
}
Wrapper.FreeMemory(ptr);
问题是,托管变量 ptr 不包含本机变量 pBuffer 包含的值。尽管指向分配的内存区域,但返回ptr
时始终为 0 。Wrapper.WaitForData
pBuffer
原型有错误吗?如何编组指向字节数组的指针?