将由垃圾收集器删除导出到C#的C++类
本文关键字:C++ 收集器 删除 | 更新日期: 2023-09-27 18:27:19
我们的想法是为C++类创建和导出一个包装器,然后从C#中使用它,如下所示:
首先,让我们创建C++类本身:
文件:MyClass.cpp
class myclass
{
public:
int funct(int val)
{
return val + 1;
}
~myclass(){}
};
然后,我们创建一个包装器:
文件包装器.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指向内存中的某个错误位置?
这里还有其他主要障碍吗?我指的是一些无法解决的问题,这些问题使这种方法变得不可能。
提前谢谢。
否,垃圾收集器只为托管内存工作。您在C++中创建的类不是托管内存,无论好坏,都不会被触碰。你需要自己管理,就像你已经做的那样。