我需要制作一个大型的c ++库,可以在.Net等语言中使用。
该库包含大量类,可以分为两组。 Refrence计算了类,它实现了IRefCounted抽象类并使用工厂方法来创建它们,而只使用new / delete的普通类。
在adittion中有许多简单的功能。
Origenannly我只是要为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 ++库,任何事情都必须作为现有类和函数的包装来完成。
答案 0 :(得分:3)
如果您只针对Windows,那么C ++ / CLI包装器绝对是最佳选择。它们表现非常好,很容易编写和维护等等。但是,正如你所说,这对Mono不起作用。问题是创建的程序集不是clr:纯程序集,而是混合了本机和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等包装器就很容易了。
答案 1 :(得分:1)
我使用SWIG来包装一些C ++代码并从单声道调用它很好。
答案 2 :(得分:0)
如果通过提供你的意思是可以进行编辑,你可以在C ++中实现一个模板/宏驱动的反射系统,并在此基础上构建C#和Mono的包装器。有关如何实现它的想法,您可以查看
DECLARE_DYNAMIC
和
RUNTIME_CLASS
MFC中的宏和
ICustomTypeDescriptor
C#中的界面。
Game Programming Gems系列中的一些书籍也涵盖了该主题。
如果另一方面你的意思是提供编程,你将需要为程序员提供他应该使用的所有类型,即你必须包装它们。
据我了解,Mono是一个能够执行CLR(和其他)产生的字节码的虚拟机,所以C#二进制文件就是你所需要的。