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

时间:2013-10-02 13:05:30

标签: c# c++ structure marshalling

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

2 个答案:

答案 0 :(得分:1)

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

这是我要说的成本与收益问题。我敢打赌,从你的问题来看,只需在C#中快速编码结构就是最好的方法。

只需2美分,税前......

答案 1 :(得分:0)

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

您需要的是Interface Definition Language (IDL),您可以在其中以与语言无关的方式描述数据。类似于Apache ThriftGoogle Protocol BuffersMessagePack

您必须采取的步骤是:

  1. 将现有的C ++结构转换为IDL。这是一次性过程。使用自定义脚本或查找现有脚本。现在有人必须解决这个问题。
  2. 设置构建系统,以便在构建时生成C#和C ++定义。
  3. 使用Thrift / ProtoBuf / MessagePack C#和C ++ API根据需要序列化和反序列化您的数据。
  4. 缺点是:

    1. 您需要构建时代码生成。但是你已经自己考虑过了,这样就已经为你完成了工作。
    2. 您必须更改C ++和C#才能正确使用为您生成的任何数据结构。
    3. 磁盘格式的二进制文件将更改,因此旧版日志将无法读取。但是你可以编写一些C ++来很容易地将它们转换成新的格式。
    4. 我认为优势超越了这一点:

      1. IDL将包含数据的规范描述。对它的任何更改都将反映在C ++和C#中。当C ++更改时,您不必手动更新C#版本。
      2. 二进制数据格式与机器无关。您将能够在各种平台上从多种不同语言读取/写入数据。
      3. 我提到的第三方库非常强大且广泛使用。比自己黑客攻击更好。