一.c封裝的dll的定義如下:
1.c封裝的dll庫中定義的結構體
#pragma pack(1)
typedef struct ZFY_INFO_S{
char cSerial[7];
char userNo[6];
char userName[32];
char unitNo[12];
char unitName[32];
} ZFY_INFO;
2.c封裝的dll庫中定義的介面
extern__stdcall WriteZFYInfo(ZFY_INFO *info, char *sPwd, unsigned short *iRet);
二.c#中呼叫程序如下:
1.c#定義的結構體
[StructLayout(LayoutKind.Sequential, Pack=2)]
public struct ZFY_INFO
{
[MarshalAs(UnmanagedType.ByValArray,SizeConst=7)]
public byte[] cSerial;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=6)]
public byte[] userNo;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
public byte[] userName;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=12)]
public byte[] unitNo;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
public byte[] unitName;
};
2.c#中呼叫介面傳遞結構體引數程序
var info = new ZFY_T5.ZFY_INFO
{
cSerial = new byte[7],
userNo = new byte[6],
userName = new byte[32],
unitNo = new byte[12],
unitName = new byte[32]
};
var buff = 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(ref info, psw, ref iRet);
if(rtn)
{
return 0;
}
return 1;
總結:現在的問題是在c#中通過這種方式呼叫傳遞結構體引數時在設備顯示設定的引數未知不對,這個是什么原因?
uj5u.com熱心網友回復:
#pragma pack(1) <--- 1[StructLayout(LayoutKind.Sequential, Pack=2)] <---2?
uj5u.com熱心網友回復:
C#結構體內,去掉[MarshalAs(UnmanagedType.ByValArray,SizeConst=7)]特性,直接定義為byte[]即可uj5u.com熱心網友回復:
c里的char是有符號的,c#里應使用sbyte對應。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/104718.html
標籤:C#
