Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换C++;在构建时将结构转换为C#结构_C#_C++_Structure_Marshalling - Fatal编程技术网

转换C++;在构建时将结构转换为C#结构

转换C++;在构建时将结构转换为C#结构,c#,c++,structure,marshalling,C#,C++,Structure,Marshalling,以下是背景: 我们有一个传统程序,它用C++编写数据日志。数据包含在不同的结构中。读取日志文件的程序使用这些相同的结构来显示数据。我重写了读取日志文件和C#的程序,并且必须手动创建所有这些结构的C#副本。 有更好的方法吗?我曾考虑过设置一个结构的查找路径,以及一种在构建时生成C#结构的解析器,但处理所有特殊情况似乎过于复杂。有什么建议吗?C#没有任何向后兼容性来处理C/C++结构,这似乎有点可笑。有多少结构,它们有多复杂 我认为这是一个成本与收益的问题。我敢打赌,从你的问题判断,用C#快速编码结

以下是背景: 我们有一个传统程序,它用C++编写数据日志。数据包含在不同的结构中。读取日志文件的程序使用这些相同的结构来显示数据。我重写了读取日志文件和C#的程序,并且必须手动创建所有这些结构的C#副本。
有更好的方法吗?我曾考虑过设置一个结构的查找路径,以及一种在构建时生成C#结构的解析器,但处理所有特殊情况似乎过于复杂。有什么建议吗?C#没有任何向后兼容性来处理C/C++结构,这似乎有点可笑。

有多少结构,它们有多复杂

我认为这是一个成本与收益的问题。我敢打赌,从你的问题判断,用C#快速编码结构是最好的方法

只有我的2美分,税前…

您的问题摘要: 在现有的C++程序中,您有大量的结构,可以将其序列化为磁盘。您希望将结构移植到C#,以便将磁盘中的数据反序列化到C#程序中。你不想只做一次。随着两个程序的发展,您希望保持两组结构同步

您需要的是一个能够以独立于语言的方式描述数据的数据库。类似于,或者

您必须采取的步骤是:

  • 将现有的C++结构转换为IDL。这是一个一次性的过程。使用自定义脚本或查找现有脚本。现在肯定有人解决了这个问题
  • 在编译时设置生成系统来生成C和C++定义。
  • 使用Teave/TimeBuff/MeasAgPACK C和C++ API根据需要串行化和反序列化数据。
  • 缺点是:

  • 您需要生成构建时代码。但是你自己已经考虑过了,这样的工作已经为你完成了
  • <> LI>你必须改变C++和C语言,以正确地使用为你生成的任何数据结构。
  • 磁盘上的二进制格式将更改,因此旧日志将无法读取。但是你可以写一些C++来很容易地把它们转换成新的格式。 我认为这比优势更重要:

  • IDL将包含数据的规范描述。对它的任何更改都会反映在C++和C语言中。当C++改变时,你不必手动更新你的C版本。
  • 二进制数据格式将独立于机器。您将能够在各种平台上从多种不同语言读取/写入数据
  • 我提到的第三方库功能强大,使用广泛。总比自己动手做强

  • 有比我想的更多的结构。有很多。问题是,如果开发人员改变C++结构,那么他们必须改变C结构。如果没有,那么我们默认显示十六进制数据。如果这是一条不经常使用的消息,那么我们可能要等到软件发布后很久才能知道。如果这是一个内部项目,您当然可以与开发团队协调,在他们更改结构时为您提供C版本的结构。。。