Czy można bezpiecznie nazwać RCW z finalizatora?

Mam obiekt zarządzany, który wywołuje serwer COM, aby przydzielić trochę pamięci. Obiekt zarządzany musi ponownie wywołać serwer COM, aby zwolnić tę pamięć, zanim zarządzany obiekt zniknie, aby uniknąć wycieku pamięci. Ten obiekt implementujeIDisposable aby upewnić się, że wykonano prawidłowe wywołanie COM zwalniające pamięć.

W przypadku, gdyDispose metoda jestnie wywoływany, chciałbym, aby finalizator obiektu zwolnił pamięć. Problem polega na tym, że zasady finalizacji polegają na tym, że nie możesz uzyskać dostępu do żadnego odniesienia, ponieważ nie wiesz, jakie inne obiekty zostały już GC'd i / lub sfinalizowane przed tobą. Pozostawia to jedyny możliwy do dotykania stan obiektu jako pole (najczęściej używane są uchwyty).

Ale wywołanie serwera COM polega na przejściu przez wrapper runtime callable (RCW) w celu zwolnienia pamięci, którą mam plik cookie do przechowywania w polu.Czy RCW jest bezpieczny do wywołania z finalizatora (czy w tym momencie zagwarantowano, że nie został GC'd lub sfinalizowany)?

Dla tych, którzy nie są zaznajomieni z finalizacją, chociaż wątek finalizatora działa w tle zarządzanej domeny aplikacji, podczas gdy jej uruchamianie, dla tych przypadków dotykanie referencji byłoby teoretycznie OK, finalizacja odbywa się również przy zamykaniu domeny aplikacji,w dowolnej kolejności - nie tylko w referencyjnym porządku relacji. To ogranicza to, co można założyć, że można bezpiecznie dotknąć finalizatora. Wszelkie odwołania do zarządzanego obiektu mogą być „złe” (pamięć zebrana), nawet jeśli odwołanie nie ma wartości NULL.

Aktualizacja: Właśnie spróbowałem i dostałem to:

W myassembly.dll wystąpił nieobsługiwany wyjątek typu „System.Runtime.InteropServices.InvalidComObjectException”

Informacje dodatkowe: nie można użyć obiektu COM, który został oddzielony od podstawowego RCW.

questionAnswers(2)

yourAnswerToTheQuestion