gpt4 book ai didi

c# - 垃圾收集器是否会删除导出到 C# 的 C++ 类?

转载 作者:行者123 更新时间:2023-11-30 01:16:29 26 4
gpt4 key购买 nike

想法是为 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);
}
}

最后,我们通过文件:程序.cs

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

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

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

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

提前致谢。

最佳答案

不,垃圾收集器只为托管内存工作。用 C++ 创建的类不是托管内存,无论好坏都不会被触及。您将需要像以前一样自己管理它。

关于c# - 垃圾收集器是否会删除导出到 C# 的 C++ 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26481112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com