通过 UDP 的 C++ 类在 C# 中使用,都有哪些选项?

Posted

技术标签:

【中文标题】通过 UDP 的 C++ 类在 C# 中使用,都有哪些选项?【英文标题】:C++ class via UDP to be used in C#, what are the options?通过 UDP 的 C++ 类在 C# 中使用,有哪些选项? 【发布时间】:2017-09-05 10:07:36 【问题描述】:

我正在通过 UDP 从 C/C++ 应用程序接收数据。此应用程序正在将类的 memcpy 放入缓冲区并将其扔给我们。我们的应用程序是用 C# 编写的,我需要以某种方式理解数据。我们可以访问结构的头文件——一切基本上都是结构或枚举。我们无法更改数据传入的格式,并且头文件可能会经常更改。

我考虑过用 C++ 重写我们的 comms 类来接收数据,然后我可以更好地控制它的序列化,但这需要很长时间,而且我的 C++ 已经生锈了,更不用说我没有有很多 C++ 线程方面的经验,这是必需的。

我还创建了一些原型 C++ 库,其中提供了可通过 C# 访问的头文件,但我无法完全理解如何在 C# 本身中实际创建和使用类的实际实例(每个当我研究这个时,我看到的只是外部函数调用,而不是外部类型的使用)。

我也研究了编组。但是,由于数据可能会经常变化,我认为这是不得已而为之的方法,而且感觉很手动。

有没有人知道任何选项或对此问题有任何更有针对性的阅读或建议?

【问题讨论】:

"memcpy of the class" 长什么样子?它是否包含元信息或任何可以这样使用的东西? 如果你调用一个非托管 dll 的函数,它返回一个自定义格式的对象,你需要在 C# 中重建这个格式/对象(例如作为结构)并将对象转换成那个。 遗憾的是没有元数据。 @Noren,我有一个 C# 版本的 C++ 对象,我目前不确定如何进行实际的重建和转换。 【参考方案1】:

为什么不在每一端都使用 Google 协议缓冲区,即 c++ 和 c#。您将使用您的 c++ 定义,让 PB 为您完成所有序列化。

协议缓冲区是 Google 用于序列化结构化数据的语言中立、平台中立、可扩展的机制——想想 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。 more...

即使在原始类型对话通常会出现问题的情况下,它也适用于不同的操作系统。

【讨论】:

谢谢,我会仔细看看这个以供将来参考但是,发送数据的 C++ 进程无法修改,并且数据被广播到的不仅仅是我的设备,所以它会还需要在所有客户端上更改代码,目前这是不可能的。所有其他客户端都是 C++,可以简单地 memcpy。 @user3103055 好的。编组可能是您最好的选择,无论您是手工制作还是编写工具从 c++ 结构自动生成 c# 定义

以上是关于通过 UDP 的 C++ 类在 C# 中使用,都有哪些选项?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 Google ProtoBuf 与 C# (UDP) 中的 Protobuf-net 聊天

C#中UDP(Socket)

如果我想在 Java、C++ 或 C# 中使用 DCCP,我都有哪些选择?

如何从 UDP 消息中播放波形数据(c#)

使用 C++ 和 Qt 通过 UDP 发送 float var

将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?