Как я могу очистить .NET вещи, когда C ++ / CLI DLL выгружается? - PullRequest
5 голосов
/ 04 августа 2010

Я новичок в C ++ / CLI, поэтому, пожалуйста, потерпите меня ...

Я работаю над смешанной C ++ / CLI DLL, которая должна служить мостом между процессом Win32 и сборкой .NET. В DLL мне нужны некоторые вещи .NET, которые будут присутствовать в течение всей жизни DLL. Инициализация не такая уж большая проблема, но я не мог понять, когда я смогу безопасно очистить .NET. Обычные средства C ++ (DLL_PROCESS_DETACH, глобальные переменные и статические локальные d'Dors), кажется, все вызываются после того, как CLR исчезает.

Итак, как получить уведомление о том, что DLL собирается отключиться от CLR, чтобы я мог освободить имеющиеся у меня ссылки .NET?

Ответы [ 4 ]

2 голосов
/ 09 августа 2010

Ну, отвечать на мой собственный вопрос кажется неловким, но это не было предложено кем-то еще, и это то, что я искал ... так:

оказывается Microsoftпредлагает экзотический вариант onexit, называемый _onexit_m , который следует использовать в DLL-библиотеках смешанного режима.При использовании _onexit_m для регистрации (управляемой) функции обратного вызова эта функция будет вызываться, когда DLL собирается быть выгруженным, но до закрытия CLR.Он похож на AppDomain.DomainUnload, , предложенный Беном Фойгтом , но по какой-то причине я не смог заставить работать DomainUnload, и _onexit_m проще использовать IMHO.

2 голосов
/ 04 августа 2010

Если вам нужно позаботиться о выгрузке AppDomain, используйте событие AppDomain.DomainUnload , чтобы выполнить очистку.

Как говорит STW, библиотеки с управляемым кодом никогда не могут быть отсоединены отAppDomain, единственный способ отсоединить его от вашего процесса - выгрузить AppDomain.

Если вы не управляете доменами приложений, просто утечка управляемого ресурса (и надлежащая очистка неуправляемых ресурсов во время отсоединения процесса).А еще лучше, разработайте его как программное обеспечение только для сбоя, чтобы не требовалось никакой очистки.

0 голосов
/ 04 августа 2010

.NET Dll следует рассматривать как набор отдельных классов ref. Каждый экземпляр класса ref имеет свое время жизни, а управление ресурсами осуществляется относительно времени жизни экземпляра класса. Правильно реализованный шаблон Dispose решает все проблемы управления ресурсами.

Каждый класс C ++ / CLI, который имеет некоторые собственные ресурсы или одноразовые члены класса, должен иметь деструктор и необязательный финализатор. В частности, ссылки .NET выпускаются в деструкторе класса, который сопоставлен с методом C # Dispose.

0 голосов
/ 04 августа 2010

Это может не относиться к стороне C ++ .NET, но, насколько мне известно, единственный способ получить CLR для освобождения загруженной сборки - избавиться от AppDomain;и если вы не внедрили ручное управление AppDomain, у вас, скорее всего, есть только начальный AppDomain, что делает удаление эквивалентным убийству вашего приложения.

...