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

C++/CLI Destructor not called when Dispose is called in C#

所以我在 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
    }
}

如果这个问题已经得到回答,我深表歉意,但我已经尝试过,但在堆栈溢出时找不到它。

啊啊找到原因了,即使我在 Visual Studio 中关闭了优化,它也会自动优化我的 Destructor 到我在 Destructor 中的第一个函数调用中。

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