猿问

C# 与 C++ Socket通讯中,结构的定义中数组长度问题

1 public class NMT_VLDATA<T1, T2>
2   {
3   [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,SizeConst=2)]
4   public T2[] Data;
5   }

复制代码

SizeConst=2 ,这个值 怎么能动态设置,或者其他实现相同效果的解决方案也行


各种对象 都用这一个模板,接收的时候需要指定对象的SIZE

因为C++那边来的数据数量不一定,而且这个结构很多个对象会用到,我不能定义这么多对象去实现,还尝试过用字符串拼出一个类,编译,反射实例化不过没有成功,编译过程失败了


慕标5832272
浏览 722回答 2
2回答

Smart猫小萌

没法动态设置,你必须改变策略。将 T2[] Data 修改为如下:IntPtr Data;然后你需要一个机制知道 T2[] 数组的长度,一种方式是被调用方会显示告诉你一个 ContentLength,另一种方式,被调用方约定读到某个特殊字符(比如 0XFF)后就停止读取。

aluckdog

相互通信的话,简单的话可以传递字节数组,然后使用array数组偏移进行数据组包或拆分。这个方法麻烦在于需要自己实现每个结构的组包或拆包。实现上全部利用.net自身平台,不用互操作等。另外可以利用json方法,传递字符流。直接绑定实体,再也不用关心长度问题或者字节对齐的问题了。这个方法从数据流量上也比较少。唯一的缺点就是binary信息需要base64编码或其它处理。因为交互的是字符流而不是字节流。
随时随地看视频慕课网APP
我要回答