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 = 16)]
public string Flag;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 4)]
public string CardType;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 4)]
public string AccType;
public UInt16 UsedCardNum;
public Int32 AccAmt;
[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 70)]
public string Pad;
};
函数调用如下:
AccountMsg pacc = new AccountMsg();
int recNum = 0;
byte[] filename = new byte[210];
int ret = TA_HazyInqAcc(ref pacc,ref recNum, filename);
错误:无法加载 DLL“AIO_API.dll”: 找不到指定的模块。
请高手指教
[解决办法]
j结构体参数
如果你的C++结构体里面包含联合体,需要使用Explict选项,
TCHAR字符串成员的话,需要考虑ANSI和Unicode DLL的情形。
考虑下C#结构体内存布局 Auto,Explicit,Sequential的。。
总之结构体在C++与C#之间互掉很麻烦的,。。
我记得有个啥工具。。可以帮助生成代码。。你找找