c# - 为 C++ 类的复杂系统创建 C# 绑定(bind)?

标签 c# c++ binding wrapper

<分区>

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

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

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

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

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

最佳答案

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

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

特别是,如果您的非托管 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/

相关文章:

c# - 在 C# 中将值从程序集传递到应用程序

c# - 将值类型捕获到 lambda 时是否执行复制?

c# - __darwin_size_t 等同于 c#

xaml - 忽略绑定(bind)初始化

c# - 如何将列表列表绑定(bind)到 WPF 中的列表框?

c# - 编写此代码的更好方法而不是 2x foreach?

c# - Gridview 更新问题 - .NET

c++ - 如何生成具有唯一值的 vector ?

c++ - Qt嵌入式Linux事件观察器

c++ - 在 clang 中强制使用 `const char[]` 字符串文字