C#调用cDll结构体数组指针的问题.docxVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C#调用c++Dll结构体数组指针的问题 ?? ?C#调用c++dll文件是一件很麻烦的事情,首先面临的是数据类型转换的问题,网上有一大堆得转换对应表,也有一大堆的转换实例,但是都没有强调一个更重要的问题,就是c#数据类型和c++数据类型占内存长度的对应关系。?? ?如果dll文件中只包含一些基础类型,那这个问题可能可以被忽略,但是如果是组合类型(这个叫法也许不妥),如结构体、类类型等,在其中的成员变量的长度的申明正确与否将决定你对dll文件调用的成败。如有以下代码,其实不是dll文件的源码,而是厂商给的c++例子代码??c++中的结构体申明typedef?struct??{????unsigned?char?Port;????unsigned?long?Id;????unsigned?char?Ctrl;????unsigned?char?pData[8];??}HSCAN_MSG;???c++中的函数申明(一个c++程序引用另一个c++的dll文件)extern?C?int?_stdcall?HSCAN_SendCANMessage(unsigned?char?nDevice,unsigned?char?nPort,HSCAN_MSG?*msg,int?nLength);???c++中的调用:HSCAN_MSG?msg[100];??.....??HSCAN_SendCANMessage(m_nDevice,m_nPort,msg,nFrames);???由上述代码可见,msg是个结构体的数组。下面是我的c#的代码c#结构体申明: [c-sharp]view plaincopy[StructLayout(LayoutKind.Sequential)]?????public?struct?HSCAN_MSG?????{??    //?UnmanagedType.ByValArray,?[MarshalAs(UnmanagedType.U1)]这个非常重要,就是申明对应类型和长度的?????[MarshalAs(UnmanagedType.U1)]?????public?byte?Port;?????[MarshalAs(UnmanagedType.U4)]?????public?uint?nId;?????[MarshalAs(UnmanagedType.U1)]?????public?byte?nCtrl;?????[MarshalAs(UnmanagedType.ByValArray,?SizeConst?=?8)]?????public?byte[]?pData;?????};???c#函数申明 [DllImport(HS2106API.dll)]?????public?static?extern?int?HSCAN_SendCANMessage(?????byte?nDevice,?byte?nPort,?HSCAN_MSG[]?pMsg,?int?nLength);???C#函数调用HSCAN_MSG[]?msg?=?new?HSCAN_MSG[1];?//发送缓冲区大小可根据需要设置;?????for?(int?yy?=?0;?yy??msg.Length;?yy++)?????{?????msg[yy]?=?new?HSCAN_MSG();?????}??    //...结构体中的成员的实例化略??    HSCAN_SendCANMessage(0x0,?0x0,?msg,?1)???那些只能用指针不能用结构体和类的地方??c++中的结构体申明typedef?struct??{????unsigned?char?Port;????unsigned?long?Id;????unsigned?char?Ctrl;????unsigned?char?pData[8];??}HSCAN_MSG;???c++中的函数申明(一个c++程序引用另一个c++的dll文件)extern?C?int?_stdcall?HSCAN_SendCANMessage(unsigned?char?nDevice,unsigned?char?nPort,HSCAN_MSG?*msg,int?nLength);???c#中的结构体申明:[StructLayout(LayoutKind.Sequential)]?????public?struct?HSCAN_MSG?????{?????[MarshalAs(UnmanagedType.U1)]?????public?byte?Port;?????///?summary?????///?节点标识,nEFF=1?时(扩展帧),为29?位nEFF=0(标准帧)时,为11?位;?????///?/

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档