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

时间:2014-10-21 07:25:54

标签: c# c++ garbage-collection

我们的想法是为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指向内存中的某个错误位置?

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

提前致谢。

1 个答案:

答案 0 :(得分:5)

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