c++ - 使 C++ 库可用于 .Net

标签 c++ .net mono cross-platform native

我需要创建一个大型 C++ 库,以便在 .Net 语言(例如 C#)中使用。

该库包含大量的类,可以分为两组。引用计数类,实现 IRefCounted 抽象类并使用工厂方法来创建它们,以及使用 new/delete 的普通类。

此外还有许多简单的函数。

最初,我只是要为 c++/clr 中的所有内容编写包装类。然而,希望生成的包装器库能够在 Mono 上运行。重新编译库和包装器以针对每个平台很好,但问题是 c++/clr 似乎只能针对 Windows,因为没有编译器可以针对其他平台,因此包装器代码无法在其他平台上工作。 ..

这里是否有我错过的东西(例如如何在 x 平台上运行 c++/clr 指南)或者是否有其他方法可以使所有 c++ 函数、结构和类可用于 C#?

编辑:我所说的可用是指可以使用,例如在我的 C++ 库中

//namespace maths{
class Vector2
{
public:
    float x,y;
    Vector2();
    Vector2(const Vector&);
    Vector2(float x, float y);
    float Dot();
    //operators
    ...
};

然后在 C# id 中希望能够像普通类一样使用它,例如

maths::Vector2 a = new maths::Vector2(5, 5);
maths::Vector2 b = new maths::Vector2(1, 10);
b *= 3
maths::Vector2 c = a + b;
//c.x == 8, c.y == 35

此外,无论我这样做,我都无法编辑 C++ 库,任何事情都必须作为现有类和函数的包装器来完成。

最佳答案

如果您仅针对 Windows,C++/CLI 包装器绝对是最佳选择。它们性能非常好,非常容易编写和维护等等。但是,正如您所说,这在 Mono 上不起作用。问题在于,创建的程序集不是 clr:pure 程序集,而是混合了 native 代码和 IL 代码的程序集,因此它无法在 Windows 之外运行。此外,如果您要面向 64 位系统,则需要在 C++/CLI 中为 x86 和 x64 目标创建单独的程序集。

SWIG 绝对是一个选择。它可以处理包装 C++ 类的所有复杂性,但是当遇到更复杂的问题时,通常必须进行一些调整。

我建议查看SWIG main site ,尤其是他们的C# section.

有关使用 SWIG 包装非常复杂的库的好示例,请查看 OGRE Dot Net (快死了,但仍然是一个很好的例子)或 GDAL 。据我所知,两者都有针对 C# 特定功能的特殊处理,并处理引用计数类、枚举等。

SWIG 的另一个好处 - 如果您制作 SWIG 包装器,那么如果您需要的话,可以很容易地将其扩展到其他语言。一旦有了包装器,制作 Java、Python、Ruby 等包装器就很容易了。

关于c++ - 使 C++ 库可用于 .Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637729/

相关文章:

c++ - 如何检测 Linux 中的文件访问?

C++ - map 包含太多元素

f# - 单声道中的 WSDL 和 F# TypeProvider

c++ - Opencv Blob 检测和矢量化

c++ - 复制初始化表单 '= {}'

c# - C# 赋值变量时的异常处理

asp.net - Web API IIS 要求

.net - 为什么 .net 世界没有像 Java 世界那样的应用服务器?

c# - 在 IKVM 中使用 C# 中的 Java 标准库时出现问题

ubuntu - Monodevelop 无法在 ubuntu 上启动?