Разрушитель C ++ / CLI не вызывается при вызове Dispose в C # - PullRequest
0 голосов
/ 27 июня 2019

Итак, у меня есть объект C ++ / CLI, который содержится внутри объекта C #.Я вызываю dispose для моего объекта C ++ / CLI, и у меня есть точки останова в деструкторе и финализаторе C ++ / CLI.

Я знаю, что .NET должен автоматически сгенерировать Dispose для объектов CLI и поместить туда деструктор,но моя точка останова в деструкторе просто не получила удара.Может кто-нибудь объяснить, что происходит со мной, потому что я не смог найти документацию этого поведения.

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 голосов
/ 28 июня 2019

Аааа узнал, почему, даже если у меня была отключена оптимизация в Visual Studio, он автоматически оптимизировал мой Деструктор до вызова функции 1, который был у меня в Деструкторе.

Так что, хотя точка останова выглядела действительнойМне пришлось поставить точку останова в другой моей функции, чтобы получить стек вызовов.(Интересно, что стек вызовов перешел непосредственно из Dispose (bool) к моей функции и пропустил деструктор)

...