为复杂的C++类系统创建C#绑定?

Gan*_*ant 4 c# c++ binding wrapper

我有现有的C++ lib,它包含许多不同的类.一些示例用法应该包括将一个类的实例传递给另一个类的构造函数/方法.

我打算使用C++/CLI为这些C++类提供C#绑定,因此我不必移植整个C++代码.

我已经可以通过创建另一个类隐藏用户现有C++代码中使用的所有类,从而以" Facade "的方式完成此操作.但是,我想要的是向用户提供具有相同方法签名的相同类.

对此有任何指导或建议吗?

PS.我已经看了一些现有的开源C#到C++绑定项目.但他们似乎使用了许多不同的方法来做到这一点,我并不是真的理解它.

pli*_*nth 5

这很大程度上取决于你的课程因素.

在我所做的工作中,我尝试将我建模的C++类视为隐藏的实现细节,并将其包装到适当的C++/CLI类中.在大多数情况下,我可以通过拥有非特别精细的托管接口来逃避这种情况.当您的实现涉及直接实现底层C++代码的每个细节时,您将最终得到一个非常"繁琐"的接口,这将涉及托管/非托管转换中的相当大的成本.

特别是,如果您的非托管C++类使用stl,特别是stl集合类型,当您发现通过stl集合的每次迭代都涉及多个托管/非托管转换时,您可能会发现自己感到不愉快.我有一个图像解码器,它使用stl很重,它就像狗一样跑.将#pragmas放在访问stl类型的代码周围的明显修复没有帮助.我发现它确实起作用的是将所有这些隐藏在一个基于句柄的C接口中,该接口隐藏了铁幕后面的所有C++ - 主义.没有stl暴露在任何地方意味着它被允许作为非托管代码存在.

我认为你最大的问题将是你如何处理集合(如果你使用任何集合)作为C++集合哲学和.NET集合哲学不匹配.我怀疑您将花费大量时间将适应类的.NET集合映射到类/类型的C++集合.

编辑 这是我前一段时间写的关于这个问题的博客文章.它使用托管C++方言,而不是C++/CLI,但问题是相同的.