gcManagedToUnmanaged MDA

메모

이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

gcManagedToUnmanaged MDA(관리 디버깅 도우미)는 스레드가 관리 코드에서 관리되지 않는 코드로 전환할 때마다 가비지 수집을 발생합니다.

Symptoms

관리되지 않는 사용자 구성 요소는 COM에 노출된 관리되는 개체를 사용하려고 할 때 액세스 위반을 throw합니다. COM 개체가 해제된 것으로 보입니다. 액세스 위반이 비결정적입니다.

원인

관리되지 않는 구성 요소가 관리되는 COM 개체를 올바르게 계산하는 참조가 아닌 경우 관리되지 않는 구성 요소가 여전히 개체에 대한 참조를 보유할 때 런타임에서 COM에 노출된 관리되는 개체를 수집할 수 있습니다. 가비지 수집 중에 런타임이 호출 Release 되므로 가비지 수집이 발생하기 전에 사용자 구성 요소가 개체를 사용하는 경우 아직 수집되지 않습니다. 이것이 비결정주의의 근원입니다.

해결 방법

이 도우미를 사용하도록 설정하면 개체가 컬렉션에 적합하고 Release 호출되는 시점 사이의 시간이 줄어들어 관리되지 않는 구성 요소가 수집된 개체에 먼저 액세스하려고 하는 것을 추적할 수 있습니다.

런타임에 미치는 영향

스레드가 관리 코드에서 관리되지 않는 코드로 전환할 때마다 가비지 수집을 발생합니다.

출력

이 MDA는 출력을 생성하지 않습니다.

구성 / 설정

<mdaConfig>
  <assistants>
    <gcManagedToUnmanaged/>
  </assistants>
</mdaConfig>

참고하십시오