Udostępnij za pośrednictwem


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>

Zobacz też