原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配

tokeyro 2016-06-17 04:27:56
依时利读卡器二次开发Demo
我要用C#读依时利的读卡器,给的是Delphi的Demo,想把它转成C#的,代码如下:

public struct TERTradeParam
{
public string IndexSectorPwdA;//= "A0A1A2A3A4A5";
public string ConsumePwd;//= "000000000000";
public string ChargePwd;//= "111111111111";
public string TACPwd;//= "0123456789ABCDEF0123456789ABCDEF";
public int AuthType;//= 2;
public int APID;//= 3;
public string EnterpriseID;//= "11223344";
public string ProvinceID;//= "11223344";
public string ProvinceAID;//= "Mifare1 App";
public string GroupAID;//= "Mifare2 App";
public string EnterpriseAID;//= "Mifare3 App";
public int CardFormat;//= 0;
}


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct TER690CardInfo
{
[MarshalAs(UnmanagedType.I4)]
public int CardNo; //卡号

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public char[] CardName; //姓名

[MarshalAs(UnmanagedType.U4)]
public Int32 CardBalance;//卡余额(单位分)

[MarshalAs(UnmanagedType.U4)]
public Int32 ChargeTimes; //充值次数

[MarshalAs(UnmanagedType.U8)]
public Int64 OverPwd; //超额密码

[MarshalAs(UnmanagedType.U4)]
public Int32 DayMoney; //日累计

[MarshalAs(UnmanagedType.U2)]
public Int16 Period; //消费时段

[MarshalAs(UnmanagedType.U2)]
public Int16 PeriodCount; //时段次数

[MarshalAs(UnmanagedType.U4)]
public Int32 MonthDay;//消费月日

[MarshalAs(UnmanagedType.U4)]
public Int32 OrderGroup;//订餐分组(0-15组)

[MarshalAs(UnmanagedType.U2)]
public Int16 OrderMonth; //订餐月

[MarshalAs(UnmanagedType.U2)]
public Int16 OrderDay; //订餐日

[MarshalAs(UnmanagedType.U2)]
public Int16 OrderListType; //订餐表类型

[MarshalAs(UnmanagedType.U2)]
public Int16 CycleMealFlag;//重复消费标志

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string OrderList; //订餐表

[MarshalAs(UnmanagedType.U2)]
public Int16 ReservedFlag; //保留,补贴批次

[MarshalAs(UnmanagedType.U2)]
public Int16 Privillege; //权限

[MarshalAs(UnmanagedType.U8)]
public Int64 EnterpriseID;//企业ID,按BCD格式存储
}
//读写参数


[DllImport("ERTrans.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenReader(int CommStyle, int ClockModel, int ComPort, int BaudRate, TERTradeParam aParam);

[DllImport("ERTrans.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ReadER690Card(int aSectorNo, string PwdA, TER690CardInfo TER690CardInfo);

[DllImport("ERTrans.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool WriteER690Card(int aSectorNo, string PwdA, TER690CardInfo TER690CardInfo);

public class sttuct
{
public struct aParam
{
public string IndexSectorPwdA;//= "A0A1A2A3A4A5";
public string ConsumePwd;//= "000000000000";
public string ChargePwd;//= "111111111111";
public string TACPwd;//= "0123456789ABCDEF0123456789ABCDEF";
public int AuthType;//= 2;
public int APID;//= 3;
public string EnterpriseID;//= "11223344";
public string ProvinceID;//= "11223344";
public string ProvinceAID;//= "Mifare1 App";
public string GroupAID;//= "Mifare2 App";
public string EnterpriseAID;//= "Mifare3 App";
public int CardFormat;//= 0;

public aParam(string _IndexSectorPwdA, string _ConsumePwd, string _ChargePwd, string _TACPwd, int _AuthType, int _APID, string _EnterpriseID, string _ProvinceID, string _ProvinceAID, string _GroupAID, string _EnterpriseAID, int _CardFormat)
{
IndexSectorPwdA = _IndexSectorPwdA;
ConsumePwd = _ConsumePwd;
ChargePwd = _ChargePwd;
TACPwd = _TACPwd;
AuthType = _AuthType;
APID = _APID;
EnterpriseID = _EnterpriseID;
ProvinceID = _ProvinceID;
ProvinceAID = _ProvinceAID;
GroupAID = _GroupAID;
EnterpriseAID = _EnterpriseAID;
CardFormat = _CardFormat;
}
}

[DllImport("ERTrans.dll", CharSet = CharSet.Auto)]
public static extern bool OpenReader(int CommStyle, int ClockModel, int ComPort, int BaudRate);

}

private void 连接_Click(object sender, EventArgs e)
{
TERTradeParam aParam = new TERTradeParam();
if (OpenReader(3, 906, 0, 0, aParam))
{
this.Text = "连接成功。";
}
else
{
this.Text = "连接失败!";
}

}

TER690CardInfo ER690CardInfo = new TER690CardInfo();

private void 读取_Click(object sender, EventArgs e)
{
try
{
//读取卡数据
int i = int.Parse(this.textEdit1.Text.Trim());
if (ReadER690Card(i, "FFFFFFFFFFFF", ER690CardInfo))
{
this.textEdit2.Text = ER690CardInfo.CardNo.ToString();
//MessageBox.Show("连接成功!");
}
else
{
this.Text = "读取失败!";
//MessageBox.Show("读取失败!");
}

}
catch (Exception)
{
this.Text = "失败";
}
}

问题:
红色代码报错

请各位大神帮帮忙(分数本想多给,但只剩下这么多了)
...全文
152 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧