3

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

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

4

3 回答 3

3

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

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

于 2009-12-22T16:47:03.573 回答
1

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

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

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

-- 编辑:编程技术 --

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

于 2009-12-22T16:43:58.010 回答
1

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

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