是垃圾收集器将C++类导出到C#中删除了吗?

Vah*_*agn 1 c# c++ garbage-collection

我们的想法是为C++类创建和导出一个包装器,然后在C#中使用它,如下所示:

首先,让我们自己创建C++类:

文件:MyClass.cpp

class myclass
{
public:

    int funct(int val)
    {
       return val + 1;
    }

 ~myclass(){}
};
Run Code Online (Sandbox Code Playgroud)

然后,我们创建一个包装器:

文件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);
}
Run Code Online (Sandbox Code Playgroud)

现在,我们来到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我们通过File:Program.cs来执行此操作

class Program
{
    static void Main(string[] args)
    {
        CsClass v = new CsClass();
        Console.WriteLine(v.Func(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

我测试了这个简单的东西,程序按照预期打印2.

问题是,C#的垃圾收集器是否会移动创建的C++对象,从而使objPtr指向内存中的某个错误位置?

这里还有其他主要障碍吗?我的意思是一些无法解决的问题使这种方法变得不可能.

提前致谢.

nvo*_*igt 5

不,垃圾收集器只能用于托管内存.你在C++中创建的类不是托管内存,不会被触及,无论是好还是坏.您需要像以前一样自己管理它.