我正在尝试从C#应用程序中使用用C ++编写的dll。我有C ++ DLL的第三方源代码(Cyclone物理引擎),不想手动将它移植到C#。
在C ++项目中
我改变它输出一个DLL。我将其更改为使用/ clr标志。我将其更改为使用多线程调试DLL(/ MDd),因为这是唯一一个与/ clr兼容并且也已编译的。
在C#项目中
我添加了对dll的引用。我正在使用旋风命名空间。
起初,命名空间下绝对没有任何内容。我认为这是因为在C ++代码中,所有类都声明没有访问修饰符,默认是私有的。因此,对于“粒子”类,我将定义更改为:
public class Particle
{
//...
}
现在我可以从C#代码成功声明一个Particle类型的变量。但是,intellesense和对象浏览器报告Particle是一个struct(?),它根本不包含任何方法。 c ++代码在“public:”访问修饰符之后声明了一堆方法,所以我不知道问题是什么。
例如,
public:
void integrate(real duration);
我做错了什么?
答案 0 :(得分:2)
Particle类不是托管类,因此它被视为结构体。您需要使用ref关键字来进行托管和垃圾回收。您还需要对引用它的每个其他可能有问题的类执行相同的操作。我认为最好的解决方案是创建一个在内部使用Particle类的托管包装类。然后可以通过.net。
引用此包装类请参阅here:
答案 1 :(得分:1)
我之前没有遇到过你的确切问题,但我之前在c#中使用过C ++ dll。通常在调用dll时,您会使用dllImport关键字。基本上,您可以定义一个从c ++ dll导入所有类型和方法的类。然后,您可以调用这些包装类。
我远非专家,但我已经用它来访问我需要使用的win32方法和其他一些库。
codeplex上的This链接有一些可能有用的链接工具。但最重要的可能是Interop助手。它可以为你的c ++ dll生成C#包装器。
这不完全是你所要求的,但我认为看一个不同的方向可能有所帮助。
答案 2 :(得分:0)
尝试使用ref关键字声明c ++类:
public ref class Particle
答案 3 :(得分:0)
您是否参考了COM Interop?