公司项目想接入中行,需要调用一个 C++ 写的 DLL 类库。
C++ 的代码如下:
C# 的结构体我该怎么声明?
我查阅资料 char 和 string 对应,但是 MarshalAs 属性不知道该怎么写。
1 [StructLayout(LayoutKind.Sequential)] 2 public struct REQUEST 3 { 4 /// <summary> 5 /// 交易类型。 6 /// </summary> 7 [MarshalAs(UnmanagedType.U2)] 8 public string szPackType; 9 /// <summary> 10 /// 交易金额,前补 0,精确到分,如“000000000100”表示1元。 11 /// </summary> 12 [MarshalAs(UnmanagedType.U4)] 13 public string szAmount; 14 /// <summary> 15 /// 卡号 (撤销、预授权完成时)。 16 /// </summary> 17 [MarshalAs(UnmanagedType.U1)] 18 public string szCardNo; 19 /// <summary> 20 /// 有效期 (撤销、预授权完成时)。 21 /// </summary> 22 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 23 public string szExpr; 24 /// <summary> 25 /// 原流水号(退货,电子现金退货用) or 原票据号 (重打印,撤销用)。 26 /// </summary> 27 public string szTraceNo; 28 /// <summary> 29 /// 原授权码(退货用)。 30 /// </summary> 31 public string szAuthId; 32 /// <summary> 33 /// 原参考号。 34 /// </summary> 35 public string szRefNo; 36 /// <summary> 37 /// 原日期(退货,电子现金退货用)格式为 YYYYMMDD。 38 /// </summary> 39 public string szDateDate; 40 /// <summary> 41 /// 原时间(退货,电子现金退货用)格式为 HHMMSS。 42 /// </summary> 43 public string szDateTime; 44 /// <summary> 45 /// 款台号,收银机编号, 该商场内唯一,全数字,左补零。 46 /// </summary> 47 public string szDesktopNo; 48 /// <summary> 49 /// 收银员编号。 50 /// </summary> 51 public string szOperator; 52 /// <summary> 53 /// 原终端号。 54 /// </summary> 55 public string szTermId; 56 };
已自己解决,使用 Byte 类型即可。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct REQUESTByte { /// <summary> /// 交易类型。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public Byte[] PackType; /// <summary> /// 交易金额,前补 0,精确到分,如“000000000100”表示1元。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public Byte[] szAmount; /// <summary> /// 卡号 (撤销、预授权完成时)。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)] public Byte[] szCardNo; /// <summary> /// 有效期 (撤销、预授权完成时)。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public Byte[] szExpr; /// <summary> /// 原流水号(退货,电子现金退货用) or 原票据号 (重打印,撤销用)。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public Byte[] szTraceNo; /// <summary> /// 原授权码(退货用)。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public Byte[] szAuthId; /// <summary> /// 原参考号。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public Byte[] szRefNo; /// <summary> /// 原日期(退货,电子现金退货用)格式为 YYYYMMDD。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szDateDate; /// <summary> /// 原时间(退货,电子现金退货用)格式为 HHMMSS。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public Byte[] szDateTime; /// <summary> /// 款台号,收银机编号, 该商场内唯一,全数字,左补零。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szDesktopNo; /// <summary> /// 收银员编号。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] public Byte[] szOperator; /// <summary> /// 原终端号。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szTermId; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct RESPONSEByte { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public Byte[] szPackType; /* 交易类型 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public Byte[] szResult; /* 交易结果返回码 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public Byte[] szCHNResult; /* 中文结果 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)] public Byte[] szCardNo; /* 卡号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public Byte[] szExpr; /* 有效期 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public Byte[] szMerchantName; /* 商户名称 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public Byte[] szMerchant; /* 商户号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szTermId; /* 终端号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public Byte[] szBankName; /* 发卡行名称 该域和内部大小不同,直接返回中文名称*/ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public Byte[] szCardType; /* 卡类型*/ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)] public Byte[] szChargeDateTime; /* 交易时间 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public Byte[] szRefNo; /* 系统参考号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szAuthId; /* 授权号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szTraceNo; /* 流水号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szSeqNo; /* 票据号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szBatchNo; /* 批次号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public Byte[] szAmount; /* 交易金额 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] szDesktopNo; /* 款台号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] public Byte[] szOperator; /* 收款员号 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public Byte[] szTranType; /* 交易方式 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public Byte[] szAppend1; /* 辅助信息 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 49)] public Byte[] szAppend2; /* 辅助信息 */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public Byte[] szAppend3; /* 辅助信息 */ }