c++结构定义:如下#define BYTE unsigned chartypedef struct __DEV_ENCODER_INFO 
{
char szDevIp[DH_MAX_IPADDR_LEN]; // 前端DVR的IP地址
WORD wDevPort; // 前端DVR的端口号
BYTE bDevChnEnable;                      // 解码通道使能
BYTE byEncoderID; // 对应解码通道号
char szDevUser[DH_USER_NAME_LENGTH_EX]; // 用户名
char szDevPwd[DH_USER_PSW_LENGTH_EX]; // 密码
int nDevChannel; // 通道号
int nStreamType; // 码流类型,0:主码流;1:子码流; 2:snap
BYTE byConnType; // 0:TCP;1:UDP;2:组播
BYTE byWorkMode; // 0:直连;1:转发
WORD wListenPort; // 指示侦听服务的端口,转发时有效
DWORD dwProtoType; // 协议类型,
// 0:兼容以前
// 1:大华二代协议
// 2:大华系统集成协议
// 3:大华DSS协议
// 4:大华rtsp协议
char szDevName[64]; // 前端设备名称
BYTE            byVideoInType;                      // 该解码通道当前视频源类型:0-标清(SD),1-高清(HD),注:设备支持高清通道才有效
char szDevIpEx[DH_MAX_CLIENT_SwitchDecTVEncoderIPADDR_OR_DOMAIN_LEN];// szDevIp扩展,前端DVR的IP地址(可以输入域名)
BYTE            bySnapMode;                         //抓图模式(nStreamType==2时有效) 0:表示请求一帧,1:表示定时发送请求
BYTE            byManuFactory; //目标设备的生产厂商,0:Private(大华私有)
BYTE            byDeviceType;                       //目标设备的设备类型,0:IPC
char reserved[48];
} DEV_ENCODER_INFO, *LPDEV_ENCODER_INFO;
转换后c#代码为: [StructLayout(LayoutKind.Sequential)]
    public struct DEV_ENCODER_INFO
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string szDevIp;  // 前端DVR的IP地址
        public ushort wDevPort;// 前端DVR的端口号
        public bool bDevChnEnable;// 解码通道使能
        public byte byEncoderID;// 对应解码通道号
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string szDevUser;// 用户名
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string szDevPwd;// 密码
        public byte nDevChannel;// 通道号
        public byte nStreamType;// 码流类型,0:主码流;1:子码流; 2:snap
        public byte byConnType;// 0:TCP;1:UDP;2:组播
        public byte byWorkMode;// 0:直连;1:转发
        public ushort wListenPort;// 指示侦听服务的端口,转发时有效
        public uint dwProtoType;// 协议类型,
        // 0:兼容以前
        // 1:大华二代协议
        // 2:大华系统集成协议
        // 3:大华DSS协议
        // 4:大华rtsp协议
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string szDevName;// 前端设备名称
        public byte byVideoInType;// 该解码通道当前视频源类型:0-标清(SD),1-高清(HD),注:设备支持高清通道才有效
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string szDevIpEx;// szDevIp扩展,前端DVR的IP地址(可以输入域名)
        public byte bySnapMode; //抓图模式(nStreamType==2时有效) 0:表示请求一帧,1:表示定时发送请求
        public byte byManuFactory;//目标设备的生产厂商,0:Private(大华私有)
        public byte byDeviceType;//目标设备的设备类型,0:IPC
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)]
        public string reserved;
    }调用dll方法使用该结构体时,使用out 参数获取该结构体时没有问题.
在c#应用程序中赋值时
szDevIp 出错;错误为 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
其他字段都没有问题.
求解;或熟悉类型转换的高手 给写个C#结构