在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++ /CLI中,当对象离开作用域时不调用c# dispose

如果我理解正确的话,您已经用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()