首页 / C# / C#-IntPtr不包含本机值
C#-IntPtr不包含本机值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-IntPtr不包含本机值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1294字,纯文字阅读大概需要2分钟。
内容图文
![C#-IntPtr不包含本机值](/upload/InfoBanner/zyjiaocheng/656/fd614b8e87b9422ebfee3c3df29b7b17.jpg)
我有一个本机方法,必须将字节数组传递到.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包含的值.尽管pBuffer指向分配的内存区域,但Wrapper.WaitForData返回时ptr始终为0.
原型有错误吗?如何整理指向字节数组的指针?
解决方法:
您需要像这样传递对指针或“双指针”的引用
__declspec(dllexport) int WaitForData(unsigned char** pBuffer)
然后更改指针的值(因为它是按值传递的)
*pBuffer = 'something'
其他选项-返回指针(然后您必须以其他方式处理int / length)
顺便说一句,这就是为什么您自动生成的原型看起来像这样(没有,ref修饰符)
内容总结
以上是互联网集市为您收集整理的C#-IntPtr不包含本机值全部内容,希望文章能够帮你解决C#-IntPtr不包含本机值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。