当对象在C ++ / CLI中保留范围时,不会调用C#dispose

时间:2013-05-13 10:51:24

标签: c# c++-cli destructor raii finalizer

我有一个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中的终结器和析构器的所有命名和使用混淆,我假设我混淆了一些东西。谁能告诉我什么? :)

2 个答案:

答案 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()