首页新闻找找看学习计划

C# 调用 C++ 类库传结构体转换的问题。

0
悬赏园豆:10 [已解决问题] 解决于 2017-10-10 21:36

公司项目想接入中行,需要调用一个 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     };
Charles Zhang的主页 Charles Zhang | 初学一级 | 园豆:38
提问于:2017-08-07 19:40
< >
分享
最佳答案
0

已自己解决,使用 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;                /* 辅助信息 */
    }
Charles Zhang | 初学一级 |园豆:38 | 2017-10-10 21:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册