我们的想法是为C ++类创建和导出一个包装器,然后在C#中使用它,如下所示:
首先,让我们自己创建C ++类:
文件:MyClass.cpp
class myclass
{
public:
int funct(int val)
{
return val + 1;
}
~myclass(){}
};
然后,我们创建一个包装器:
File wrapper.cpp
extern "C" __declspec(dllexport) myclass* expConst()
{
return new myclass();
}
extern "C" __declspec(dllexport) void expDispose(myclass * obj)
{
delete obj;
}
extern "C" __declspec(dllexport) int expfunct(myclass* obj, int val)
{
return obj->funct(val);
}
现在,我们来到c#:
public class CsClass : IDisposable
{
//Import the functions from dll
[DllImport("ExportedLib.dll")]
public static extern IntPtr expDispose(IntPtr obj);
[DllImport("ExportedLib.dll")]
public static extern IntPtr expConst();
[DllImport("ExportedLib.dll")]
public static extern int expfunct(IntPtr obj, int val);
IntPtr objPtr;
public CsClass()
{
objPtr = expConst();
}
public int funct(int q)
{
return expfunct(objPtr, q);
}
public void Dispose()
{
expDispose(objPtr);
}
}
最后,我们通过以下方式执行此操作 文件:Program.cs中
class Program
{
static void Main(string[] args)
{
CsClass v = new CsClass();
Console.WriteLine(v.Func(1));
}
}
我测试了这个简单的东西,程序按照预期打印2。
问题是,C#的垃圾收集器是否会移动创建的C ++对象,从而使objPtr指向内存中的某个错误位置?
这里还有其他主要障碍吗?我指的是一些无法解决的问题,这使得这种方法变得不可能。
提前致谢。
答案 0 :(得分:5)
不,垃圾收集器只能用于托管内存。你在C ++中创建的类不是托管内存,不会被触及,无论是好还是坏。您需要像以前一样自己管理它。