다음을 통해 공유


System.Runtime.Loader.AssemblyLoadContext 클래스

이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.

AssemblyLoadContext 부하 컨텍스트를 나타냅니다. 개념적으로 로드 컨텍스트는 어셈블리 집합을 로드, 확인 및 언로드하기 위한 범위를 만듭니다.

AssemblyLoadContext 주로 어셈블리 로드 격리를 제공하기 위해 존재합니다. 단일 프로세스 내에서 동일한 어셈블리의 여러 버전을 로드할 수 있습니다. .NET Framework의 여러 AppDomain 인스턴스에서 제공하는 격리 메커니즘을 대체합니다.

비고

런타임의 사용량

런타임은 두 개의 어셈블리 로드 컨텍스트를 구현합니다.

애플리케이션 사용량

애플리케이션은 고급 시나리오에 대한 맞춤 솔루션을 만들기 위해 자체 AssemblyLoadContext을(를) 적용할 수 있습니다. 사용자 지정은 종속성 확인 메커니즘을 정의하는 데 중점을 둡니다.

AssemblyLoadContext는 관리되는 어셈블리 해결을 구현하기 위한 두 가지 확장 지점을 제공합니다.

  1. AssemblyLoadContext.Load(AssemblyName) 메서드는 AssemblyLoadContext가 어셈블리를 확인하고 로드하며 반환할 수 있는 첫 번째 기회를 제공합니다. 메서드가 AssemblyLoadContext.Load(AssemblyName)null로 반환하면 로더는 어셈블리를 AssemblyLoadContext.Default에 로드하려고 시도합니다.
  2. 어셈블리를 AssemblyLoadContext.Default에서 해결할 수 없는 경우, 원래 AssemblyLoadContext이 어셈블리를 해결할 수 있는 두 번째 기회가 준비됩니다. 런타임이 Resolving 이벤트를 발생시킵니다.

또한 가상 메서드를 AssemblyLoadContext.LoadUnmanagedDll(String) 사용하면 관리되지 않는 기본 어셈블리 해상도를 사용자 지정할 수 있습니다. 기본 구현은 null를 반환하여 런타임 검색이 기본 검색 정책을 사용하도록 합니다. 기본 검색 정책은 대부분의 시나리오에 충분합니다.

기술 과제

  • 단일 프로세스에서 여러 버전의 런타임을 로드할 수 없습니다.

    주의

    여러 복사본 또는 다른 버전의 프레임워크 어셈블리를 로드하면 예기치 않고 진단하기 어려운 동작이 발생할 수 있습니다.

    팁 (조언)

    원격 또는 프로세스 간 통신과 함께 프로세스 경계를 사용하여 이 격리 문제를 해결합니다.

  • 어셈블리 로드 타이밍으로 인해 테스트 및 디버깅이 어려울 수 있습니다. 어셈블리는 일반적으로 종속성이 즉시 확인되지 않고 로드됩니다. 종속성은 필요에 따라 로드됩니다.

    • 코드가 종속 어셈블리로 분기되는 경우
    • 코드가 리소스를 로드하는 경우
    • 코드가 어셈블리를 명시적으로 로드하는 경우
  • AssemblyLoadContext.Load(AssemblyName)를 구현하면 서로 다른 버전이 존재할 수 있도록 격리해야 할지도 모르는 새로운 종속성이 추가될 수 있습니다. 가장 자연스러운 구현은 이러한 종속성을 기본 컨텍스트에 배치합니다. 신중한 디자인은 새 종속성을 격리할 수 있습니다.

  • 동일한 어셈블리가 여러 컨텍스트에 여러 번 로드됩니다.

    • 이로 인해 "'Sample.Plugin' 형식의 개체를 'Sample.Plugin' 형식으로 캐스팅할 수 없습니다."와 같은 혼동스러운 오류 메시지가 생성될 수 있습니다.
    • 격리 경계를 넘어 데이터를 정리하고 구성하는 작업은 간단하지 않습니다. 일반적인 솔루션은 기본 로드 컨텍스트로만 로드되는 어셈블리에 정의된 인터페이스를 사용하는 것입니다.