求c++结构体转c#问题

syxsyx7 syxsyx7 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
c++结构定义:如下

#define BYTE unsigned char

typedef 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#结构
...全文

相关推荐

评论 11
收藏 已收藏
分享
返回顶部
syxsyx7
C# 111,129 成员 642,538 内容