gcManagedToUnmanaged MDA
Uwaga
Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.
Asystent gcManagedToUnmanaged
zarządzanego debugowania (MDA) powoduje odzyskiwanie pamięci za każdym razem, gdy wątek przechodzi z zarządzanego do niezarządzanego kodu.
Objawy
Niezarządzany składnik użytkownika zgłasza naruszenie dostępu podczas próby użycia zarządzanego obiektu, który został uwidoczniony w modelu COM. Wydaje się, że obiekt COM został zwolniony. Naruszenie dostępu jest nieokreślone.
Przyczyna
Jeśli niezarządzany składnik nie odlicza poprawnie zarządzanego obiektu COM, środowisko uruchomieniowe może zebrać zarządzany obiekt uwidoczniony w modelu COM, gdy niezarządzany składnik nadal przechowuje odwołanie do obiektu. Środowisko uruchomieniowe wywołuje wywołania Release podczas odzyskiwania pamięci, więc jeśli składnik użytkownika używa obiektu przed rozpoczęciem odzyskiwania pamięci, nie zostanie jeszcze zebrany. Jest to źródło nieokreśloności.
Rozwiązanie
Włączenie tego asystenta skraca czas między tym, kiedy obiekt kwalifikuje się do kolekcji i Release jest wywoływany, co pomaga w śledzeniu, który niezarządzany składnik najpierw próbuje uzyskać dostęp do zebranego obiektu.
Wpływ na środowisko uruchomieniowe
Powoduje odzyskiwanie pamięci za każdym razem, gdy wątek przechodzi z zarządzanego do niezarządzanego kodu.
Wyjście
Ta usługa MDA nie generuje żadnych danych wyjściowych.
Konfigurowanie
<mdaConfig>
<assistants>
<gcManagedToUnmanaged/>
</assistants>
</mdaConfig>