Вы должны удалить свой неуправляемый объект из метода Dipose
вашего управляемого объекта. Вы также должны вызвать Dispose
из метода Finalize
, если ваш код не вызвал Dispose
до того, как сборщик мусора добрался до него. Ответ Адама Робинсона иллюстрирует это намного лучше.
Так что, если вы усердны с вами Распоряжаться вызовами (и используете блоки using
), у вас не должно быть аварийных остановов.
Редактировать: Я думаю, что проблема в том, что на самом деле неуправляемая DLL выгружается до запуска финализатора. Ye old "Как только приложение закрывается, нет никаких гарантий относительно того, в каком порядке он выгружается".
Возможно, вы можете поэкспериментировать с неуправляемыми ресурсами в управляемой сборке C ++? Таким образом, вы знаете, что DLL не сработает, пока вы не закончили с этим, и вам не нужно делать уродливые вещи P / Invoke.
Вот пример из MSDN:
ref struct A {
// destructor cleans up all resources
~A() {
// clean up code to release managed resource
// ...
// to avoid code duplication
// call finalizer to release unmanaged resources
this->!A();
}
// finalizer cleans up unmanaged resources
// destructor or garbage collector will
// clean up managed resources
!A() {
// clean up code to release unmanaged resource
// ...
}
};
Подробнее здесь http://msdn.microsoft.com/en-us/library/ms177197.aspx
Выше приведен тот же шаблон, что и в C #, за исключением того, что вы можете избежать использования неуправляемых ресурсов в управляемой сборке C ++. Если вы действительно ДОЛЖНЫ иметь их в неуправляемой DLL (не в статической неуправляемой библиотеке), то вы застряли, у вас будут те же проблемы с завершением работы.