2

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

4

2 回答 2

2

如果我理解正确,您已经用 C# 编写了这个类,并从 C++/CLI 中使用它。

你是正确的,C++/CLI 会自动Dispose为你调用——但只有当你正在处理的类实现时IDisposable。在你的情况下,你的类没有实现IDisposable,因此,Dispose在这种情况下只是一个普通的方法。

按如下方式更改您的课程:

public sealed class CLoadingScope : IDisposable
于 2013-05-13T13:15:11.733 回答
0

希望这可以帮助:

添加一个析构函数,使 c++ /cli 自动继承 IDisposable。

然后强制转换为 IDisposable 以访问 Dispose 方法

((IDisposable)obj).Dispose();

PS 关于 C# Dispose() 是使用 using 语句调用的,当然也可以手动调用,否则它不会自动调用,不确定为什么 C++/CLI 中的 using 等效项不调用 Dispose()

于 2013-05-13T12:42:16.970 回答