C#调用C++提示“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配。”

 修改海康摄像头设备显示名称显示未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配,下面是我的代码。

  CHCNetSDK.NET_DVR_PICCFG config = new CHCNetSDK.NET_DVR_PICCFG();
  config.sChanName = System.Text.Encoding.UTF8.GetBytes("海康摄像头");
  int size = Marshal.SizeOf(config);
  int lChannel = 0x001;
  IntPtr ptr = Marshal.AllocHGlobal(size);
  Marshal.StructureToPtr(config, ptr, true);
  Boolean res = CHCNetSDK.NET_DVR_SetDVRConfig(this.UserId,     
  CHCNetSDK.NET_DVR_SET_PICCFG, lChannel, ptr, (uint)size);
  if (!res) {
      uint err = CHCNetSDK.NET_DVR_GetLastError();
      Console.WriteLine("error code is {0}", err);
  }

  Marshal.FreeHGlobal(ptr);

其实错误是

config.sChanName = System.Text.Encoding.UTF8.GetBytes("海康摄像头");

这句代码写错了,由于C语言字符串的特性,config.sChanName 是是个固定长度的字符数组,属性的定义如下

    public struct NET_DVR_PICCFG {
            public uint dwSize;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sChanName;
    }

其中SizeConst = NAME_LEN 这里标注了这个数组的长度,这里长度是定义的是32个字符,如下图。

所以正确的写法应该是

config.sChanName = new byte[CHCNetSDK.NAME_LEN];//这里定义的长度一定要跟属性指定的属性长度一致
Encoding.UTF8.GetBytes("海康摄像头").CopyTo(config.sChanName,0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值