C#与C++结构体的对应

来源:互联网 发布:软件开发与数据库设计 编辑:程序博客网 时间:2024/06/15 15:22

问题: 使用C#调用一个非托管的VC++的Dll,参数中包含一个结构体指针,C#如何与其对应?

该Dll导出接口:

BOOL GetLocalInfo(PLOCALINFO pLocalInfo);

其中,关于PLOCALINFO, 是这样定义的:

//C++的结构体,用此结构存储本地信息typedef struct _Local_Info {char chMainMac[80];  //主Mac地址char chHostName[80];  //主机名char chIpAddress[80]; //IP地址}LOCALINFO, *PLOCALINFO;

在C#中,需要定义同样的结构用接收返回的本地信息.

//C#中对应的结构, 存储本地信息的结构体,该结构体用于接收参数中的返回值[StructLayout( LayoutKind.Sequential,Pack=1)]public struct LOCALINFO{        [MarshalAs( UnmanagedType.ByValTStr,SizeConst=80)]        public string chMainMac;   //主Mac地址        [MarshalAs( UnmanagedType.ByValTStr,SizeConst=80)]        public string chHostName;   //主机名        [MarshalAs(UnmanagedType .ByValTStr,SizeConst=80)]        public string chIpAddress;  //IP地址}

另外, 在传递参数时,原C++接口为一个结构体的指针, 而C#中没有指针的概念, 可以使用ref关键字传入引用结构体. 如下

LOCALINFO localInfo = new LOCALINFO();//注意这里传的是结构体的引用getLocalInfo(ref localInfo);

总结, 主要以下关键点:

(1)C++/C#中结构体及变量的对应, 特别是C++中char[]与C#中如何对应.

(2)C#调用非托管类型dll时, 对于指针类型参数如何构造和传递: 使用ref关键字传入引用对象即可.

(3)运行时无问题,发现非托管接口处调试时出现异常,提示大约是声明不一致类信息,在非托管接口处加上WINAPI声明后问题解决.

原创粉丝点击