Mam obiekt zarządzany, który wywołuje serwer COM w celu przydzielenia pamięci. Obiekt zarządzany musi ponownie wywołać serwer COM, aby zwolnić tę pamięć, zanim obiekt zarządzany zniknie, aby uniknąć wycieku pamięci. Ten obiekt implementuje IDisposable
, aby zapewnić prawidłowe wywołanie COM zwalniające pamięć.Czy można bezpiecznie wywołać RCW z finalizatora?
Jeśli metoda ma być , a nie, chciałbym, aby finalizator obiektu zwolnił pamięć. Kłopot w tym, że zasady finalizacji polegają na tym, że nie możesz uzyskać dostępu do żadnych referencji, ponieważ nie wiesz, jakie inne obiekty zostały już GC'd i/lub sfinalizowane przed tobą. Pozostawia to jedyny dotykany obiekt jako pola (najczęściej są to uchwyty).
Jednak wywoływanie serwera COM wymaga przechodzenia przez opakowanie runtime (RCW) w celu zwolnienia pamięci, której plik cookie jest przechowywany w polu. Czy RCW można bezpiecznie wywołać z finalizatora (czy w tym momencie gwarantowane jest, że nie został GCdd sfinalizowany)?
Dla tych z Was nie zna finalizacji, chociaż wątek finalizator działa w tle zarządzanym AppDomain, a jego bieg, w tych przypadkach dotykających referencje teoretycznie być OK, finalizacja dzieje się również w AppDomain zamykania i w dowolnej kolejności - nie tylko w porządku relacji odniesienia. Ogranicza to, co możesz założyć, że możesz bezpiecznie dotknąć swojego finalizatora. Wszelkie odniesienia do zarządzanego obiektu mogą być "złe" (pamięć zebrana), nawet jeśli odwołanie ma wartość inną niż null.
Aktualizacja: Właśnie spróbowałem i dostałem to:
nieobsługiwany wyjątek typu 'System.Runtime.InteropServices.InvalidComObjectException' wystąpił w myassembly.dll
Informacje dodatkowe: obiekt COM który został oddzielony od podstawowego RCW, nie może być użyty.
Metoda na serwerze COM (dlaczego ktoś miałby nazywać się Dispose na samym RCW? Byłbym zaskoczony, gdyby to było możliwe). –