基于C#调用C++ Dll结构体数组指针的问题详解 C#调用C++ Dll文件是一件很麻烦的事情,首先面临的是数据类型转换的问题。相信经常做C#开发的都和我一样把学校的那点C++基础都忘光了吧(语言特性类)。网上有一大堆得转换对应表,也有一大堆的转换实例,但是都没有强调一个更重要的问题,就是C#数据类型和C++数据类型占内存长度的对应关系。 如果Dll文件中只包含一些基础类型,那这个问题可能可以被忽略,但是如果是组合类型(这个叫法也许不妥),如结构体、类类型等,在其中的成员变量的长度的申明正确与否将决定你对Dll文件调用的成败。 在C++中,结构体的申明通常使用typedef关键字,例如: typedef struct { unsigned char Port; unsigned long Id; unsigned char Ctrl; unsigned char pData[8]; }HSCAN_MSG; 而在C#中,使用StructLayoutAttribute特性来申明结构体,例如: [StructLayout(LayoutKind.Sequential)] public struct HSCAN_MSG { [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++中,函数的申明通常使用extern "C"关键字,例如: extern "C" int _stdcall HSCAN_SendCANMessage(unsigned char nDevice,unsigned char nPort,HSCAN_MSG *msg,int nLength); 而在C#中,使用DllImportAttribute特性来申明函数,例如: [DllImport("HS2106API.dll")] public static extern int HSCAN_SendCANMessage( byte nDevice, byte nPort, HSCAN_MSG[] pMsg, int nLength); 在C#中调用C++ Dll文件时,需要注意结构体数组的申明和使用。例如: 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#中,使用MarshalAsAttribute特性来申明结构体成员的类型和长度,例如: [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] pData; 在C#中,使用StructLayoutAttribute特性来申明结构体的.layouts,例如: [StructLayout(LayoutKind.Sequential)] public struct HSCAN_MSG { //... } C#调用C++ Dll文件需要注意数据类型的转换和结构体数组的申明和使用。
- 粉丝: 6
- 资源: 930
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助