none
C#调用C++ 结构体嵌套结构体 内存移位。无法获取正确的信息 RRS feed

  • 问题

  • //设备基本信息
    typedef struct tagSystem
    {
    	char               szName[CHAR_ARRAY_32];            //设备名称
    	char               szUser[CHAR_ARRAY_32];            //用户名
    	char               szPassword[CHAR_ARRAY_32];        //用户密码
    	char               szManufacturer[CHAR_ARRAY_32];    //生产厂商
    	unsigned int       uDeviceType;                      //设备类型 参见DNK_DEVICETYPE
    	unsigned int       uCapability;                      //设备能力集
    	unsigned int       uProductDate;                     //生产日期
    	unsigned int       uProductSn;                       //产品序列号
    	unsigned int       uSoftVersion;                     //软件版本
    	unsigned int       uHardVersion;                     //硬件版本
    	unsigned int       uAlgVersion;                      //算法版本
    	unsigned int       uVideoChannelNum;                 //视频通道数
    	unsigned int       uAudioChannelNum;                 //音频通道数
    	unsigned int       uDecodeChannelNum;                //解码通道数
    	unsigned int       uIOChannelNum;                    //I/O报警通道数
    	unsigned int       uSerialNum;                       //串口数
    
    }TDNK_SYSTEM,*LPDNK_SYSTEM;
    
    //网络信息
    typedef struct tagNetwork
    {
    	unsigned int       uDhcp;                            //DHCP开关  0-关 1-开
    	unsigned int       uServerIp;                        //中心服务器IP
    	unsigned int       uServerPort;                      //中心服务器监听端口
    	unsigned int       uIpv4Addr;                        //Ipv4的地址
    	unsigned int       uIpv4Mask;                        //Ipv4的子网掩码
    	unsigned int       uIpv4Gateway;                     //Ipv4的网关地址
    	unsigned int       uIpv4Dns;                         //Ipv4的DNS
    	unsigned char      byMac[CHAR_ARRAY_6];              //MAC地址
    	char               szIpv6Addr[CHAR_ARRAY_64];        //Ipv6地址
    	char               szIpv6Mask[CHAR_ARRAY_64];        //Ipv6子网掩码
    	char               szIpv6Gateway[CHAR_ARRAY_64];     //Ipv6网关地址
    	char               szIpv6Dns[CHAR_ARRAY_64];         //Ipv6DNS
    
    }TDNK_NETWORK,*LPDNK_NETWORK;

    我转换成 C#

     public class NetWork
        {
            //网络信息
           [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
            public struct tagNetwork
            {
                public uint uDhcp;                            //DHCP开关  0-关 1-开
                public uint uServerIp;                        //中心服务器IP
                public uint uServerPort;                      //中心服务器监听端口
                public uint uIpv4Addr;                        //Ipv4的地址
                public uint uIpv4Mask;                        //Ipv4的子网掩码
                public uint uIpv4Gateway;                     //Ipv4的网关地址
                public uint uIpv4Dns;                         //Ipv4的DNS
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
                public byte[] byMac;              //MAC地址
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
                public byte[] szIpv6Addr;        //Ipv6地址
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
                public byte[] szIpv6Mask;        //Ipv6子网掩码
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
                public byte[] szIpv6Gateway;     //Ipv6网关地址
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
                public byte[] szIpv6Dns;         //Ipv6DNS
    
            }
        }
        public class NetSystem
        {
            //设备基本信息
           [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
            public struct tagSystem
            {
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public byte[] szName;           //设备名称
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public byte[] szUser;            //用户名
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public byte[] szPassword;        //用户密码
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public byte[] szManufacturer;    //生产厂商
                public uint uDeviceType;                      //设备类型 参见DNK_DEVICETYPE
                public uint uCapability;                      //设备能力集
                public uint uProductDate;                     //生产日期
                public uint uProductSn;                       //产品序列号
                public uint uSoftVersion;                     //软件版本
                public uint uHardVersion;                     //硬件版本
                public uint uAlgVersion;                      //算法版本
                public uint uVideoChannelNum;                 //视频通道数
                public uint uAudioChannelNum;                 //音频通道数
                public uint uDecodeChannelNum;                //解码通道数
                public uint uIOChannelNum;                    //I/O报警通道数
                public uint uSerialNum;                       //串口数
    
            }
        }
    
       //上报和搜索响应
            [StructLayoutAttribute(LayoutKind.Sequential)]
            public struct tagActiveReport
            {
    
                public NetSystem.tagSystem dnkSystem;                        //基本信息
                public NetWork.tagNetwork dnkNetwork;                       //网络信息
    
                //public IntPtr dnkSystem;                        //基本信息
                //public IntPtr dnkNetwork;                       //网络信息
    
            }
    
    

    总是内存移位,现在怀疑是结构体嵌套结构体问题 求解。。。。。。。。。。。。。。。。。。。。。。。。。。。急!

    2014年12月15日 9:31

答案

  • 你好:

    这种情况一般是由于类型不匹配造成的,C++结构体中的数据类型如果和C#定义的结构体数据类型对应不正确就会出现代码执行结果不正确的情况,建议你逐一排查一下,参考MSDN中的类型对照表

    http://msdn.microsoft.com/zh-cn/library/4xwz0t37(v=vs.100).aspx


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月16日 5:38
    版主

全部回复

  • 有没好心人啊。。可怜可怜啊。。。
    2014年12月15日 9:56
  • 你好:

    这种情况一般是由于类型不匹配造成的,C++结构体中的数据类型如果和C#定义的结构体数据类型对应不正确就会出现代码执行结果不正确的情况,建议你逐一排查一下,参考MSDN中的类型对照表

    http://msdn.microsoft.com/zh-cn/library/4xwz0t37(v=vs.100).aspx


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月16日 5:38
    版主