c#调用c封装的dll中一字节对齐的结构体问题

[复制链接]
查看11 | 回复3 | 2021-1-27 06:22:41 | 显示全部楼层 |阅读模式
一.c封装的dll的定义如下:
1.c封装的dll库中定义的结构体
#pragmapack(1)
typedefstructZFY_INFO_S{
charcSerial[7];
charuserNo[6];
charuserName[32];
charunitNo[12];
charunitName[32];
}ZFY_INFO;
2.c封装的dll库中定义的接口
extern__stdcallWriteZFYInfo(ZFY_INFO*info,char*sPwd,unsignedshort*iRet);
二.c#中调用过程如下:
1.c#定义的结构体
[StructLayout(LayoutKind.Sequential,Pack=2)]
publicstructZFY_INFO
{
[MarshalAs(UnmanagedType.ByValArray,SizeConst=7)]
publicbyte[]cSerial;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=6)]
publicbyte[]userNo;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
publicbyte[]userName;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=12)]
publicbyte[]unitNo;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
publicbyte[]unitName;
};
2.c#中调用接口传递结构体参数过程
varinfo=newZFY_T5.ZFY_INFO
{
cSerial=newbyte[7],
userNo=newbyte[6],
userName=newbyte[32],
unitNo=newbyte[12],
unitName=newbyte[32]
};
varbuff=Encoding.Unicode.GetBytes("");
Array.Copy(buff,info.userName,buff.Length);
buff=Encoding.Unicode.GetBytes("");
Array.Copy(buff,info.unitName,buff.Length);
buff=Encoding.ASCII.GetBytes(p1Val);
Array.Copy(buff,info.userNo,buff.Length);
buff=Encoding.ASCII.GetBytes(p5Val);
Array.Copy(buff,info.cSerial,buff.Length);
buff=Encoding.ASCII.GetBytes("");
Array.Copy(buff,info.unitNo,buff.Length);
rtn=ZFY_T5.WriteZFYInfo(refinfo,psw,refiRet);
if(rtn)
{
return0;
}
return1;
总结:现在的问题是在c#中通过这种方式调用传递结构体参数时在设备显示设置的参数未知不对,这个是什么原因?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:22:41 | 显示全部楼层
#pragmapack(1)<---1
[StructLayout(LayoutKind.Sequential,Pack=2)]<---2?

回复

使用道具 举报

千问 | 2021-1-27 06:22:41 | 显示全部楼层
C#结构体内,去掉[MarshalAs(UnmanagedType.ByValArray,SizeConst=7)]特性,直接定义为byte[]即可
回复

使用道具 举报

千问 | 2021-1-27 06:22:41 | 显示全部楼层
c里的char是有符号的,c#里应使用sbyte对应。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行