在C#中调用Dispose时未调用C ++ / CLI析构函数

时间:2019-06-27 18:16:08

标签: c# .net c++-cli dispose

因此,我在C#对象中拥有一个C ++ / CLI对象。我在C ++ / CLI对象上调用dispose,并且在C ++ / CLI析构函数和终结器中都有一个断点。

我知道.NET应该自动为CLI对象生成一个Dispose并将析构函数放在其中,但是我在析构函数中的断点只是没有被击中。有人可以解释一下发生了什么事,因为我无法找到有关此行为的任何文档。

C#

public void Dispose()
{
    foreach (var wrapper in m_items)
    {
        var disposable = wrapper.Data as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }
}

C ++ / CLI

public ref class ClassA: System::IDisposable {
...
    ClassA::~ClassA()
    {
        // Clean up code
    }

    ClassA::!ClassA()
    {
        // Clean up code
    }
}

对于这个问题是否已经回答,我深表歉意,但是我已经尝试过并且在堆栈溢出时找不到它。

1 个答案:

答案 0 :(得分:0)

Ahhh找出了原因,即使我在Visual Studio中没有进行优化,它也会将我的Destructor自动优化为我在Destructor中进行的1函数调用。

因此,即使断点看起来有效,我也必须在其他函数中放置一个断点才能获取调用堆栈。 (有趣的是,调用栈直接从Dispose(bool)转到了我的函数,并且跳过了析构函数)