C#调用C++ dll时,结构体参数类型的转换
C++ 接口如下:
int _stdcall TA_HazyInqAcc(AccountMsg *pAccMsg, int *RecNum , char *FileName,short TimeOut = 10);
结构体如下:
typedef struct
{
char Name[21]; /*姓名*/
char SexNo[2]; /*性别*/
char DeptCode[19]; /*部门代码*/
unsigned int CardNo; /*卡号*/
unsigned int AccountNo; /*帐号*/
char StudentCode[21]; /*学号*/
char IDCard[21]; /*身份证号*/
char PID[3]; /*身份代码*/
char IDNo[13]; /*身份序号*/
int Balance; /*现余额*/
char Password[7]; /*消费密码*/
char ExpireDate[7]; /*账户截止日期*/
unsigned short SubSeq; /*补助戳*/
char IsOpenInSys; /*是否在本系统内开通*/
short TerminalNo; /*终端号码,提取补助时需要填写*/
short RetCode; /*后台处理返回值*/
char Flag[16]; /*状态(2004-08-26增加)*/
char CardType[4]; /*卡类型*/
char AccType[4];
unsigned short UsedCardNum; /*卡片上的用卡次数*/
long AccAmt;
char Pad[70]; /*预留字段*/
} AccountMsg;
我现在这样调用的
[DllImport("AIO_API.dll")]
public static extern int TA_HazyInqAcc(ref read AccMsg, ref int RecNum, byte[] FileName, short TimeOut = 10);
C#定义的结构体
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
public struct AccountMsg
{
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 21)]
public string Name;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 2)]
public string SexNo;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 19)]
public string DeptCode;
public UInt32 CardNo;
public UInt32 AccountNo;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 21)]
public string StudentCode;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 21)]
public string IDCard;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 3)]
public string PID;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 13)]
public string IDNo;
public int Balance;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 7)]
public string Password;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 7)]
public string ExpireDate;
public UInt16 SubSeq;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 1)]
public char IsOpenInSys;
public short TerminalNo;
public short RetCode;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst