2

我需要制作一个可用于 .Net 语言(例如 C#)的大型 c++ 库。

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

此外,还有许多简单的功能。

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

我在这里错过了什么(比如如何在 x 平台上运行 c++/clr 指南)还是有一种替代方法可以使所有 c++ 函数、结构和类对 C# 可用?

编辑: avaible 我的意思是可以在我的 c++ lib 中使用,例如我有

//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++ 库,任何事情都必须作为现有类和函数的包装器来完成。

4

3 回答 3

3

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

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

我建议查看SWIG 主站点,尤其是他们的C# 部分。

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

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

于 2009-03-12T15:17:03.590 回答
1

我使用SWIG包装了一些 C++ 代码并从单声道调用它效果很好。

于 2009-03-12T13:27:09.683 回答
0

如果通过使可用意味着可以进行编辑,则可以在 C++ 中实现模板/宏驱动的反射系统,并在此之上构建 C# 和 Mono 的包装器。有关如何实现它的想法,您可以查看

DECLARE_DYNAMIC

RUNTIME_CLASS

MFC 中的宏和

ICustomTypeDescriptor

C#中的接口。

Game Programming Gems 系列中的一些书籍也涵盖了该主题。

另一方面,如果您的意思是使编程可用,那么您显然必须为程序员提供他应该使用的所有类型,即您必须包装它们。

据我了解,Mono 是一个能够执行由 CLR(和其他)生成的字节码的虚拟机,因此您只需要 C# 二进制文件。

于 2009-03-12T09:41:47.777 回答