2012-04-16 12 views
5

Mam klasę C# com, która jest używana przez nieuszkodzony kod. Mogę go debugować, ale nie wiem, kiedy obiekt zostanie zwolniony. Jeśli zostałby zaimplementowany w C++ descructur zostałby wywołany, na C# zostałby on zwolniony do GC. Czy istnieje jakiś sposób śledzenia tego momentu? Z góry dzięki.Śledzenie wydania obiektu COM C#.

+0

Poszukujesz finalizatora? – SLaks

+0

Po prostu ciekawy, możesz użyć C# [destructor] (http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx) w tej sytuacji? –

+0

Brak odpowiedzi tutaj. Twoja instancja klasy [ComVisible] to zwykły stary obiekt .NET. Jest utrzymywany przy życiu przez odniesienie w CCW. Ostateczne wywołanie Release() niszczy kod CCW, ale nic nie dzieje się z obiektem .NET. Dopóki nie zbierze śmieci jak normalnie. Musisz debugować natywny kod. Gdzie i tak problem jest położony. –

Odpowiedz

1

Zarządzane typy, które utrzymują niezarządzane zasoby, powinny implementować interfejs IDisposable. To informuje klientów o kodzie, że muszą zadzwonić pod numer Dispose() po wystąpieniu obiektu (obiektów), gdy są z nimi (tj. Zawinąć je w blok using, gdy jest to możliwe).

Właściwa implementacja IDisposable spowoduje zwolnienie zasobów macierzystych w ich finalizatorze, ale klienci mogą zadzwonić pod numer Dispose() wcześniej niż w przypadku deterministycznego udostępniania niezarządzanych zasobów. W obu przypadkach unikasz przecieku, ale lepiej jak najszybciej zadzwonić pod numer Dispose().

Here is an SO question który szczegółowo opisuje proces.

+0

Problem polega na tym, że nie mogę kontrolować niezarządzanego kodu. Nie ma żadnych koniecznych porządków, których GC nie może wykonać. Chciałbym tylko wiedzieć, jaki jest oczekiwany czas życia mojego obiektu. – user629926

+0

Jeśli nie masz kontroli nad natywnym kodem, to nie rozumiem tego pytania. Kod zarządzany nie ma możliwości oczyszczenia natywnego kodu, chyba że natywny kod definiuje interfejs, aby to zrobić. GC dbający o twoje zarządzane opakowanie nie ma znaczenia; to nie tylko magiczne oczyszczenie rodzimych rzeczy. Trzeba to zrobić samodzielnie, implementując IDisposable i wywołując jakąś funkcję w swoich macierzystych zasobach, aby ją uwolnić. –

+0

Nie mam żadnych natywnych zasobów do czyszczenia, chcę tylko wiedzieć, kiedy jest realizowany zarządzany warper. – user629926