将由垃圾收集器删除导出到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#的C++类

否,垃圾收集器只为托管内存工作。您在C++中创建的类不是托管内存,无论好坏,都不会被触碰。你需要自己管理,就像你已经做的那样。