admin 管理员组

文章数量: 887021


2023年12月17日发(作者:eclipse快捷键注释代码)

C#调用c++Dll结构体数组指针的问题C#调用c++dll文件是一件很麻烦的事情,首先面临的是数据类型转换的问题,网上有一大堆得转换对应表,也有一大堆的转换实例,但是都没有强调一个更重要的问题,就是c#数据类型和c++数据类型占内存长度的对应关系。如果dll文件中只包含一些基础类型,那这个问题可能可以被忽略,但是如果是组合类型(这个叫法也许不妥),如结构体、类类型等,在其中的成员变量的长度的申明正确与否将决定你对dll文件调用的成败。如有以下代码,其实不是dll文件的源码,而是厂商给的c++例子代码c++中的结构体申明fstruct2.{edcharPort;edlongId;edcharCtrl;edcharpData[8];7.}HSCAN_MSG;c++中的函数申明(一个c++程序引用另一个c++的dll文件)"C"int_stdcallHSCAN_SendCANMessage(unsignedcharnDevice,unsignedcharnPort,HSCAN_MSG*msg,intnLength);c++中的调用:_MSGmsg[100];2......_SendCANMessage(m_nDevice,m_nPort,msg,nFrames);由上述代码可见,msg是个结构体的数组。下面是我的c#的代码c#结构体申明:

[c-sharp]viewplaincopy1.[StructLayout(tial)]structHSCAN_MSG3.{4.//rray,[MarshalAs(UnmanagedType.U1)]这个非常重要,就是申明对应类型和长度的5.[MarshalAs(UnmanagedType.U1)]bytePort;7.[MarshalAs(UnmanagedType.U4)]uintnId;9.[MarshalAs(UnmanagedType.U1)]bytenCtrl;11.[MarshalAs(rray,SizeConst=8)]12.13.c#函数申明1.2.3.[DllImport("")]publicstaticexternintHSCAN_SendCANMessage(bytenDevice,bytenPort,HSCAN_MSG[]pMsg,intnLength);public};byte[]pData;C#函数调用_MSG[]msg=newHSCAN_MSG[1];//发送缓冲区大小可根据需要设置;(intyy=0;yy<;yy++)3.{[yy]=newHSCAN_MSG();5.}6.//...结构体中的成员的实例化略_SendCANMessage(0x0,0x0,msg,1)那些只能用指针不能用结构体和类的地方c++中的结构体申明

fstruct2.{edchar7.}HSCAN_MSG;Port;Id;Ctrl;pData[8];c++中的函数申明(一个c++程序引用另一个c++的dll文件)"C"int_stdcallHSCAN_SendCANMessage(unsignedcharnDevice,unsignedcharnPort,HSCAN_MSG*msg,intnLength);c#中的结构体申明:1.2.3.4.5.6.7.[StructLayout(tial)]publicstructHSCAN_MSG{[MarshalAs(UnmanagedType.U1)]publicbytePort;///

///节点标识,nEFF=1时(扩展帧),为29位nEFF=0(标准帧)时,为11位;8.///9.[MarshalAs(UnmanagedType.U4)]uintnId;11.[MarshalAs(UnmanagedType.U1)]bytenCtrl;13.[MarshalAs(rray,SizeConst=8)]};byte[]pData;c#函数的调用:包含使用指针IntPtr替代结构体数组和读取IntPtr的方法_MSG[]msg1=newHSCAN_MSG[10];(inti=0;i<;3.{1[i]=newHSCAN_MSG();1[i].pData=newbyte[8];i++)

6.7.8.}IntPtr[]ptArray=newIntPtr[1];ptArray[0]=Global((typeof(HSCAN_MSG))*10);pt=Global((typeof(HSCAN_MSG)));(ptArray,0,pt,1);nt=HSCAN_ReadCANMessage(0x0,0,pt,10);+="/r/n"+"读取0口:"+ng()+"帧数据";(intj=0;j<10;j++)16.{1[j]=18.(HSCAN_MSG)tructure((IntPtr)((UInt32)pt+*(typeof(HSCAN_MSG)))19.,typeof(HSCAN_MSG));+="/r/n收到0口"+(msg1[j].pData[0]).ToString()21.+"|"+(msg1[j].pData[1]).ToString()22.+"|"+(msg1[j].pData[2]).ToString()23.+"|"+(msg1[j].pData[3]).ToString()24.+"|"+(msg1[j].pData[4]).ToString()25.+"|"+(msg1[j].pData[5]).ToString()26.+"|"+(msg1[j].pData[6]).ToString()27.+"|"+(msg1[j].pData[7]).ToString();j


本文标签: 结构 申明 指针 长度 调用