当对象离开C+中的作用域时,不调用C#dispose+/CLI

当对象离开C+中的作用域时,不调用C#dispose+/CLI,c#,c++-cli,destructor,raii,finalizer,C#,C++ Cli,Destructor,Raii,Finalizer,我有一个C#对象,它负责ressource,如下所示: public sealed class CLoadingScope { private bool isDisposed; public CLoadingScope() {} ~CLoadingScope() { // must be disposed otherwise it is used incorrectly if (!isDisposed) {

我有一个C#对象,它负责ressource,如下所示:

  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);
    }
  };
{
  CLoadingScope scope;
  // CODE THAT USES THE RESSOURCE HERE […]
}
我在一些C++/CLI代码中使用了这一点,如下所示:

  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);
    }
  };
{
  CLoadingScope scope;
  // CODE THAT USES THE RESSOURCE HERE […]
}
但这会导致抛出异常。 我希望这能起作用,因为Dispose是C#类的析构函数,堆栈对象在其作用域的末尾被销毁。至少我是这样解释的。 在C语言中,所有的终结和析构函数的命名和使用混乱,C++和C++ +CLI假设我混淆了一些东西。有人能告诉我什么吗?:)

希望这有助于:

添加析构函数,使C++ +CLI自动继承IDISPISTION.

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

((IDisposable)obj).Dispose();

关于C#Dispose()是用using语句调用的,当然也可以手动调用,否则它不会自动调用,不知道为什么C++/CLI中的using等价物没有调用Dispose()

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

C++/CLI将自动为您调用
Dispose
,这是正确的,但只有当您正在处理的类实现了
IDisposable
。在您的例子中,您的类没有实现
IDisposable
,因此,在本例中,
Dispose
只是一个普通方法

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

public sealed class CLoadingScope : IDisposable

使用(var a=new CLoadingScope())实现IDisposable接口+使用,该接口将调用析构函数…@Sergejs我认为C++/CLI.hmm中不允许使用指令,抱歉。这就是它在C#中的工作原理。然后,我相信您必须手动调用析构函数。为了更深入地了解何时调用dispose,请阅读此SO post,对于您阅读此SO post可能更明确的答案。此外,当对象被处置时,它仅排队等待GC,这将在“以后”发生,明确地称之为RAII有点违背了RAII的目的,即在存在异常的情况下使其工作/C#类是由另一个开发人员编写的,我只是错过了接口继承的缺失。谢谢你指出!