积极答复者
C++的char*缓冲区获取在WPF获取问题

问题
-
C++的dll里的一个导出函数,如:
int MsgCallBack(char* buf,int len)
在c#里导入:
int MsgCallBack([MarshalAs(UnmanagedType.LPArray)] byte[] buf,int len)
在c++里,通过memcpy等获得buf的内容,在c#里呢?Marshal.Copy没有重载Copy(byte[],byte[],int offset,int len)
是否能获取到buf指向的内存指针?因为看MSDN里从非托管拷贝数据到托管,都需要一个IntPtr指针
- 已移动 Jie Bao 2012年4月25日 2:53 (发件人:Windows Presentation Foundation)
答案
-
虽然你是一个WPF项目,但是问题是一个.Net托管中从非托管数据拷贝数据的问题,应属于 .NET Framework 一般性问题讨论区 ,我会移过去的。
你的问题的答案是:
在C#通过unsafe的方式,我们可以操作指针来复制数据。参考:http://msdn.microsoft.com/zh-cn/library/28k1s2k6.aspx
当然safe的方式有,Buffer.BlockCopy:http://msdn.microsoft.com/zh-cn/library/system.buffer.blockcopy.aspx 从一个数组中复制出数据到另一个数组(数组都在GC堆中)。
我比较疑惑的是,本身你PInvoke后,调用了MsgCallBack,数据就已经转成byte[] ,可以直接操作这个byte[] ,没有必要做一次 复制了。
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 猪宝贝 2012年4月26日 3:18
全部回复
-
虽然你是一个WPF项目,但是问题是一个.Net托管中从非托管数据拷贝数据的问题,应属于 .NET Framework 一般性问题讨论区 ,我会移过去的。
你的问题的答案是:
在C#通过unsafe的方式,我们可以操作指针来复制数据。参考:http://msdn.microsoft.com/zh-cn/library/28k1s2k6.aspx
当然safe的方式有,Buffer.BlockCopy:http://msdn.microsoft.com/zh-cn/library/system.buffer.blockcopy.aspx 从一个数组中复制出数据到另一个数组(数组都在GC堆中)。
我比较疑惑的是,本身你PInvoke后,调用了MsgCallBack,数据就已经转成byte[] ,可以直接操作这个byte[] ,没有必要做一次 复制了。
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 猪宝贝 2012年4月26日 3:18
-
我有点明白了,所以你PInvoke那里应该用 IntPtr 去接受这个指针。然后再用unsafe方式去访问。
Bob Bao [MSFT]
MSDN Community Support | Feedback to us