c#调用c++dll 结构体指针的问题

.Net技术 码拜 6年前 (2015-05-10) 669次浏览 0个评论

 c++dl函数
 int _stdcall TA_ReadCardSimple(AccountMsg * pAccMsg);
结构
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                      Pad[84];                      /*预留字段*/
 } AccountMsg;

我在c#里面引用
[DllImport(“AIO_API.dll”)]
        public static extern int TA_ReadCardSimple(ref  IntPtr pAccMsg);
定义结构
[StructLayout(LayoutKind.Sequential)]
        public struct AccountMsg
        { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public byte[] Name;                         /*姓名*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            public byte[] SexNo;                          /*性别*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)]
            public byte[] DeptCode;                   /*部门代码*/
             [MarshalAs(UnmanagedType.U4)]
            public uint CardNo;                            /*卡号*/
             [MarshalAs(UnmanagedType.U4)]
            public uint AccountNo;                       /*帐号*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public byte[] StudentCode;               /*学号*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public byte[] IDCard;                       /*身份证号*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
            public byte[] PID;                              /*身份代码*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
            public byte[] IDNo;                          /*身份序号*/
           [MarshalAs(UnmanagedType.U4)]
            public uint Balance;                             /*现余额*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
            public byte[] Password;                      /*消费密码*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
            public byte[] ExpireDate;                    /*账户截止日期*/
             [MarshalAs(UnmanagedType.U4)]
            public uint SubSeq;                             /*补助戳*/
           [MarshalAs(UnmanagedType.U1)]
            public byte IsOpenInSys;                     /*是否在本系统内开通*/
            [MarshalAs(UnmanagedType.U4)]
            public uint TerminalNo;                       /*终端号码,提取补助时需要填写*/
           [MarshalAs(UnmanagedType.U4)]
            public uint RetCode;                           /*后台处理返回值*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] Flag;                            /*状态(2004-08-26增加)*/
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 84)]
            public byte[] Pad;                      /*预留字段*/
}

调用 IntPtr[] ptArray = new IntPtr[1];
            ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(AccountMsg)) * 1);
            IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(AccountMsg)));
            Marshal.Copy(ptArray, 0, pt, 1);         
           int  a = TA_ReadCardSimple(ref  pt);       
               msg1[0] =
               (AccountMsg)Marshal.PtrToStructure((IntPtr)((UInt32)pt + 0 * Marshal.SizeOf(typeof(AccountMsg)))
               , typeof(AccountMsg));
               MessageBox.Show(Convert.ToByte(msg1[0].Name[0]).ToString());
在倒数第二句报引发类型为“System.ExecutionEngineException”的异常。谁能帮看看谢谢

直接将C#里面的结构体申明成string 类型,长度和C++结构体的长度一样就可以了,就象这样

// using System.Runtime.InteropServices;
 struct tagTest
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
        public string sName;
    }
你说的这种试过了,但是还是这个异常
100分
确认下c++函数的定义,如果传回来的是单个结构体 

  [DllImport("AIO_API.dll", EntryPoint = "TA_ReadCardSimple", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int TA_ReadCardSimple(ref AccountMsg pAccountMsg);

同时在AccountMsg 结构体定义上加上这个声明
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
保证字节对齐
应该就可以了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#调用c++dll 结构体指针的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!