在c++ /CLI中,当对象离开作用域时不调用c# dispose
本文关键字:作用域 调用 dispose 离开 对象 c++ CLI | 更新日期: 2023-09-27 18:13:20
我有一个c#对象,它负责一个资源,看起来像这样:
public sealed class CLoadingScope
{
private bool isDisposed;
public CLoadingScope()
{}
~CLoadingScope()
{
// must be disposed otherwise it is used incorrectly
if (!isDisposed)
{
throw new ApplicationException("RAII object has not been disposed");
}
}
public void Dispose()
{
// CLEANUP CODE HERE […]
isDisposed = true;
GC.SuppressFinalize(this);
}
};
我在一些c++/CLI代码中使用这个,像这样:
{
CLoadingScope scope;
// CODE THAT USES THE RESSOURCE HERE […]
}
但是这会导致抛出异常。我希望这能起作用,因为Dispose是c#类的析构函数,堆栈对象在其作用域结束时被销毁。至少我是这样理解这个问题的答案的。在c#、c++和c++/CLI中,终结器和析构器的命名和使用都很混乱,我想我把一些东西弄混了。有人能告诉我什么吗?:)
如果我理解正确的话,您已经用c#编写了这个类,并且正在从c++/CLI中使用它。
你是正确的,c++/CLI将自动为你调用Dispose
——但这只有在你正在处理的类实现IDisposable
的情况下。在你的例子中,你的类没有实现IDisposable
,因此,Dispose
在这个例子中只是一个普通的方法。
按如下方式修改你的类:
public sealed class CLoadingScope : IDisposable
希望对您有所帮助:
添加一个析构函数,使c++/cli自动继承IDisposable。
然后转换为IDisposable以访问Dispose方法
((IDisposable)obj).Dispose();
注:关于c# Dispose()是用using语句调用的,当然也可以手动调用,否则它不会自动调用,不确定为什么c++/CLI中的using等同不调用Dispose()