我想将原型为:#define NAME_LEN  32
#define SERIALNO_LEN  48
#define MAX_CHANNUM  16
typedef struct  {
BYTE sSerialNumber[SERIALNO_LEN]; //保留
BYTE byAlarmInPortNum; //DVR报警输入个数
BYTE byAlarmOutPortNum; //DVR报警输出个数
BYTE byDiskNum;   //DVR 硬盘个数
BYTE byDVRType; //DVR类型, 1:DVR 2:ATM DVR 3:DVS  (建议使用HB_SDVR_GetDeviceType)
BYTE byChanNum; //DVR 通道个数
BYTE byStartChan; //保留
BYTE sDvrName[NAME_LEN]; //主机名
BYTE sChanName[MAX_CHANNUM][NAME_LEN];  //通道名称
}HB_SDVR_DEVICEINFO, *LPHB_SDVR_DEVICEINFO;转为C#代码      [StructLayout(LayoutKind.Sequential)]
        public struct HB_SDVR_DEVICEINFO
        {
            /// <summary>
            /// 序列号
            ///     public byte sSerialNumber[SERIALNO_LEN];
            /// </summary>
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN)]
            public byte[] sSerialNumber;//保留
            public byte byAlarmInPortNum;//DVR报警输入个数
            public byte byAlarmOutPortNum;//DVR报警输出个数
            public byte byDiskNum;//DVR 硬盘个数
            public byte byDVRType;//DVR类型, 1:DVR 2:ATM DVR 3:DVS  (建议使用HB_SDVR_GetDeviceType)
            public byte byChanNum;//DVR 通道个数
            public byte byStartChan;//保留
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN)]
            public byte[] sDvrName;//主机名
            [???]
            public byte[] sChanName;//通道名称
        }  sChanName[???]这里我该如何标识!??大虾出来帮下忙,不胜感激!!

解决方案 »

  1.   


            [StructLayout(LayoutKind.Sequential)]
            public struct HB_SDVR_DEVICEINFO
            {
                /// <summary>
                /// 序列号
                ///     public byte sSerialNumber[SERIALNO_LEN];
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN)]
                public byte[] sSerialNumber;//保留
                public byte byAlarmInPortNum;//DVR报警输入个数
                public byte byAlarmOutPortNum;//DVR报警输出个数
                public byte byDiskNum;//DVR 硬盘个数
                public byte byDVRType;//DVR类型, 1:DVR 2:ATM DVR 3:DVS  (建议使用HB_SDVR_GetDeviceType)
                public byte byChanNum;//DVR 通道个数
                public byte byStartChan;//保留
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN)]
                public byte[] sDvrName;//主机名
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN * MAX_CHANNUM)]
                public byte[] sChanName;//通道名称
            }??这样么?
    还请教一下,
    C++原型为:        HB_SDVR_API LONG __stdcall HB_SDVR_Login(char *sDVRIP,WORD wDVRPort,char *sUserName,char *sPassword,LPHB_SDVR_DEVICEINFO lpDeviceInfo);
    我转为C#后为:        [DllImport(SdkDllFile)]
            public static extern int HB_SDVR_Login(string sDVRIP, ushort wDVRPort, string sUserName, string sPassword, out HB_SDVR_DEVICEINFO lpDeviceInfo);我调用该方法后提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的错误!
    是不是我转换的类型不对!!??
      

  2.   


    我就在想二维数据转为NAME_LEN * MAX_CHANNUM,我原来这么写过,但还是出错。