【问题标题】:Shared common definitions across C/C++ (unmanaged) and managed C# code跨 C/C++(非托管)和托管 C# 代码共享通用定义
【发布时间】:2010-12-29 04:30:45
【问题描述】:

我有一组 C# 托管组件和非托管 C/C++ 组件都使用的结构定义。现在,相同的结构定义分别存在于 C/C++ 和 C# 代码中 - 导致重复和相关的混乱。维护可以从 C# 和 C/C++ 使用的单个定义的最佳方法是什么? 谢谢! 阿米特

P.S.:我是 C/C++ 人,所以如果有明显的方法可以做到这一点,我可能会完全错过它!

【问题讨论】:

    标签: c# c++ architecture idl


    【解决方案1】:

    我曾经想在我的一个项目中这样做,该项目在 C# 代码和 C 代码之间存在硬分离。理想情况下,C# 代码会从 C 代码中借用头文件,但是:

    • 由于 C# 不支持包含,我看不出如何共享结构的定义并将其包含在 C# 或 C/C++ 代码中
    • 将结构定义放在单独的标题中并不方便
    • 我不想依赖 IDL 或自定义“解析 C 标头并仅提取结构定义”预处理步骤

    【讨论】:

      【解决方案2】:

      您需要 IDL(接口定义语言)尝试谷歌搜索:

      1. 协议缓冲区。
      2. ICE(互联网通信引擎)。
      3. 也许是 Microsoft COM?。
      4. --edit: 新条目--微软似乎有一个IDL compiler

      这一切都取决于你想要什么。上述所有技术都有 IDL 元素,并带有自己的包袱。 我个人会保持低级 C/C++ :D。 所以我会谷歌 “Imatix GSL” 并使用上述技术在 XML 中建模问题并生成数据结构在任何编程语言中——这项技术非常简单和微妙,并且需要有经验的程序员,所以如果它没有意义,你应该坚持使用 IDL。

      -- 编辑:编程技术--

      如果您愿意,可以通过纯技术解决问题。当工程的严谨性崩溃时,混乱随之而来。如果您决定使用防火墙并将问题封装到纯 C/C++ 代码中,您将不必担心接口会在您的依赖代码中出现——这是因为任何有用的语言都可以与您的 ABI 接口平台(简单的 C 函数:P)。关键不是暴露内部结构,而只是一个具有不透明类型的接口,例如表示可以在您的类型上执行的对象和函数的数字句柄。

      【讨论】:

        【解决方案3】:

        显然,我不熟悉您的项目,但您是否考虑过在C++/CLI 中为您的库构建托管桥?通过 C++/CLI 编译器为您执行的“It Just Works”黑客攻击,您可以多次编组和共享托管类型与本机代码来回。

        同样,如果没有更多细节,我不知道它是否适合您,但它可能值得研究。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-29
          相关资源
          最近更新 更多