我有一组 C# 托管组件和非托管 C/C++ 组件都使用的结构定义。现在,相同的结构定义分别存在于 C/C++ 和 C# 代码中 - 导致重复和相关的混乱。维护可以从 C# 和 C/C++ 使用的单个定义的最佳方法是什么?谢谢!阿米特
PS:我是 C/C++ 人,所以如果有明显的方法可以做到这一点,我可能会完全错过它!
我有一组 C# 托管组件和非托管 C/C++ 组件都使用的结构定义。现在,相同的结构定义分别存在于 C/C++ 和 C# 代码中 - 导致重复和相关的混乱。维护可以从 C# 和 C/C++ 使用的单个定义的最佳方法是什么?谢谢!阿米特
PS:我是 C/C++ 人,所以如果有明显的方法可以做到这一点,我可能会完全错过它!
显然,我不熟悉您的项目,但是您是否考虑过在C++/CLI中为您的库构建托管桥?通过 C++/CLI 编译器为您执行的“It Just Works”黑客攻击,很多时候您将能够与本机代码来回编组和共享托管类型。
同样,如果没有更多细节,我不知道它是否适合您,但它可能值得研究。
你需要一个 IDL(接口定义语言)尝试谷歌搜索:
这一切都取决于你想要什么。上述所有技术都有 IDL 元素,并带有自己的包袱。我个人会保持低级 C/C++ :D。所以我会谷歌“Imatix GSL”并使用上述技术在 XML 中建模问题并以任何编程语言生成数据结构——这项技术非常简单和微妙,需要有经验的程序员,所以如果它没有意义你应该坚持使用 IDL。
-- 编辑:编程技术 --
如果您愿意,您可以通过纯技术解决问题。当工程的严谨性崩溃时,混乱随之而来。如果您决定使用防火墙并将问题封装到纯 C/C++ 代码中,您将不必担心接口会落在您的依赖代码中——这是因为任何有用的语言都可以与您平台的ABI接口(简单的 C 函数:P)。关键不是暴露内部结构,而只是一个具有不透明类型的接口,例如表示可以在您的类型上执行的对象和函数的数字句柄。
我曾经想在我的一个项目中这样做,该项目在 C# 代码和 C 代码之间存在硬分离。理想情况下,C# 代码会从 C 代码中借用头文件,但是: