ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-IntPtr不包含本机值

2019-12-01 12:14:29  阅读:289  来源: 互联网

标签:interop compact-framework c net pinvoke


我有一个本机方法,必须将字节数组传递到.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修饰符)

标签:interop,compact-framework,c,net,pinvoke
来源: https://codeday.me/bug/20191201/2080957.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有