Czasami, kiedy zakończyć aplikację i próbuje zwolnić niektóre obiekty COM, otrzymałem ostrzeżenie w debugerze:Właściwy sposób zwalniania obiektów COM?
RaceOnRCWCleanUp
wykryto
Jeśli piszę klasy, która używa obiektów COM, czy muszę zaimplementować IDisposable
i zadzwonić pod numer Marshal.FinalReleaseComObject
w IDisposable.Dispose
, aby je poprawnie zwolnić?
Jeśli Dispose
nie jest wywoływana ręcznie, czy nadal muszę zwolnić je w finalizatorze, czy GC automatycznie je zwolni? Teraz I call Dispose(false)
in the finalizer, ale zastanawiam się, czy to jest poprawne.
Obiekt COM, którego używam, ma również obsługę zdarzeń, której słucha klasa. Wygląda na to, że zdarzenie jest wywoływane w innym wątku, więc jak poprawnie go obsłużyć, jeśli zostanie zwolniony podczas usuwania klasy?
To przypomnienie, że ręczne zarządzanie pamięcią nie jest świetnym pomysłem. Ta MDA ostrzega z powodu potencjalnych poważnych awarii w serwerze COM. Próba wyrzucenia czegokolwiek podczas wyłączania aplikacji jest bezcelowa, zostanie sfinalizowana o milisekundę później. GC już wie, jak to zrobić, unikaj pomocy. –