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' 형식으로 캐스팅할 수 없습니다."라는 오류 메시지가 혼동됩니다.
    • 격리 경계를 넘어 마샬링하는 것은 간단하지 않습니다. 일반적인 솔루션은 기본 로드 컨텍스트로만 로드되는 어셈블리에 정의된 인터페이스를 사용하는 것입니다.