Closed. This question is opinion-based 。它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。

2年前关闭。



Improve this question




我有现有的 C++ 库,其中包含许多协同工作的不同类。一些示例用法应该包括诸如将一个类的实例传递给另一个类的构造函数/方法之类的内容。

我计划使用 C++/CLI 为这些 C++ 类提供 C# 绑定(bind),因此我不必移植整个 C++ 代码。

我已经可以通过创建另一个类来以“Facade”的方式做到这一点,该类对用户隐藏现有 C++ 代码中使用的所有类。但是,我想要的是向用户提供具有相同方法签名的相同类。

对此有什么指导方针或建议吗?

附:我查看了一些现有的开源 C# 到 C++ 绑定(bind)项目。但是他们似乎使用了许多不同的方法来做这件事,我真的不明白。

最佳答案

这在很大程度上将取决于您的类的分解。

在我所做的工作中,我尝试将我建模的 C++ 类视为隐藏的实现细节,我将这些细节包装到适当的 C++/CLI 类中。在大多数情况下,我可以通过使用不是特别细化的托管接口(interface)来摆脱这种情况。当您的实现涉及直接实现底层 C++ 代码的每个细节时,您最终会得到一个非常“健谈”的界面,这将涉及托管/非托管转换中的大量成本。

特别是,如果您的非托管 C++ 类使用 STL,尤其是 STL 集合类型,当您发现 STL 集合的每次迭代都涉及多个托管/非托管转换时,您可能会发现自己感到不愉快。我有一个大量使用 STL 的图像解码器,因此它像狗一样奔跑。将#pragmas 放在访问STL 类型的代码周围的明显修复没有帮助。我发现确实有效的是将所有这些隐藏在基于句柄的 C 接口(interface)中,该接口(interface)将所有 C++ 主义隐藏在铁幕后面。任何地方都没有暴露的 STL 意味着它可以作为非托管代码存在。

我认为您最大的问题将是您如何处理集合(如果您使用的话),因为 C++ 集合哲学和 .NET 集合哲学并不匹配。我怀疑您将花费大量时间将改编类的 .NET 集合映射到您的 C++ 类/类型集合。

编辑
Here's a blog article 我前段时间写过这个问题。它使用托管 C++ 方言,而不是 C++/CLI,但问题是相同的。

关于c# - 为复杂的 C++ 类系统创建 C# 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2356450/

10-15 02:33