我有一个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#类的析构函数,堆栈对象在其作用域的末尾被销毁。至少我是如何解释answer to this question的。 由于C#,C ++和C ++ / CLI中的终结器和析构器的所有命名和使用混淆,我假设我混淆了一些东西。谁能告诉我什么? :)
答案 0 :(得分:2)
如果我理解正确,您已在C#中编写此类,并且正在使用C ++ / CLI。
你是正确的,C ++ / CLI将自动为你调用Dispose
- 但这只是在你正在处理的类实现IDisposable
时。在您的情况下,您的类没有实现IDisposable
,因此,在这种情况下,Dispose
只是一种常规方法。
按如下方式更改课程:
public sealed class CLoadingScope : IDisposable
答案 1 :(得分:0)
希望这会有所帮助:
添加一个析构函数,使c ++ / cli自动继承IDisposable。
然后转换为IDisposable以访问Dispose方法
((IDisposable)obj).Dispose();
P.S。关于C#Dispose()用using语句调用,当然也是手动调用,否则不会自动调用,不知道为什么C ++ / CLI中的等效使用不调用Dispose()