이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.
AssemblyLoadContext 부하 컨텍스트를 나타냅니다. 개념적으로 로드 컨텍스트는 어셈블리 집합을 로드, 확인 및 언로드하기 위한 범위를 만듭니다.
AssemblyLoadContext 주로 어셈블리 로드 격리를 제공하기 위해 존재합니다. 단일 프로세스 내에서 동일한 어셈블리의 여러 버전을 로드할 수 있습니다. .NET Framework의 여러 AppDomain 인스턴스에서 제공하는 격리 메커니즘을 대체합니다.
비고
- AssemblyLoadContext 에서는 보안 기능을 제공하지 않습니다. 모든 코드에는 프로세스의 모든 권한이 있습니다.
- .NET Core 2.0 - 2.2에서만 AssemblyLoadContext 추상 클래스입니다. 이러한 버전에서 구체적인 클래스를 만들려면 메서드를 구현합니다 AssemblyLoadContext.Load(AssemblyName) .
런타임의 사용량
런타임은 두 개의 어셈블리 로드 컨텍스트를 구현합니다.
- AssemblyLoadContext.Default 는 애플리케이션 주 어셈블리 및 정적 종속성에 사용되는 런타임의 기본 컨텍스트를 나타냅니다.
- Assembly.LoadFile(String) 메서드는 가장 기본적인 AssemblyLoadContext을 인스턴스화하여 로드하는 어셈블리를 격리합니다. 단순한 격리 체계로, 각 어셈블리를 종속성 확인 없이 독립적으로 AssemblyLoadContext에서 로드합니다.
애플리케이션 사용량
애플리케이션은 고급 시나리오에 대한 맞춤 솔루션을 만들기 위해 자체 AssemblyLoadContext을(를) 적용할 수 있습니다. 사용자 지정은 종속성 확인 메커니즘을 정의하는 데 중점을 둡니다.
AssemblyLoadContext는 관리되는 어셈블리 해결을 구현하기 위한 두 가지 확장 지점을 제공합니다.
- 이 AssemblyLoadContext.Load(AssemblyName) 메서드는 AssemblyLoadContext가 어셈블리를 확인하고 로드하며 반환할 수 있는 첫 번째 기회를 제공합니다. 메서드가 AssemblyLoadContext.Load(AssemblyName)를
null
로 반환하면 로더는 어셈블리를 AssemblyLoadContext.Default에 로드하려고 시도합니다. - 어셈블리를 AssemblyLoadContext.Default에서 해결할 수 없는 경우, 원래 AssemblyLoadContext이 어셈블리를 해결할 수 있는 두 번째 기회가 준비됩니다. 런타임이 Resolving 이벤트를 발생시킵니다.
또한 가상 메서드를 AssemblyLoadContext.LoadUnmanagedDll(String) 사용하면 관리되지 않는 기본 어셈블리 해상도를 사용자 지정할 수 있습니다. 기본 구현은 null
를 반환하여 런타임 검색이 기본 검색 정책을 사용하도록 합니다. 기본 검색 정책은 대부분의 시나리오에 충분합니다.
기술 과제
단일 프로세스에서 여러 버전의 런타임을 로드할 수 없습니다.
주의
여러 복사본 또는 다른 버전의 프레임워크 어셈블리를 로드하면 예기치 않고 진단하기 어려운 동작이 발생할 수 있습니다.
팁 (조언)
원격 또는 프로세스 간 통신과 함께 프로세스 경계를 사용하여 이 격리 문제를 해결합니다.
어셈블리 로드 타이밍으로 인해 테스트 및 디버깅이 어려울 수 있습니다. 어셈블리는 일반적으로 종속성이 즉시 확인되지 않고 로드됩니다. 종속성은 필요에 따라 로드됩니다.
- 코드가 종속 어셈블리로 분기되는 경우
- 코드가 리소스를 로드하는 경우
- 코드가 어셈블리를 명시적으로 로드하는 경우
AssemblyLoadContext.Load(AssemblyName)를 구현하면 서로 다른 버전이 존재할 수 있도록 격리해야 할지도 모르는 새로운 종속성이 추가될 수 있습니다. 가장 자연스러운 구현은 이러한 종속성을 기본 컨텍스트에 배치합니다. 신중한 디자인은 새 종속성을 격리할 수 있습니다.
동일한 어셈블리가 여러 컨텍스트에 여러 번 로드됩니다.
- 이로 인해 "'Sample.Plugin' 형식의 개체를 'Sample.Plugin' 형식으로 캐스팅할 수 없습니다."와 같은 혼동스러운 오류 메시지가 생성될 수 있습니다.
- 격리 경계를 넘어 데이터를 정리하고 구성하는 작업은 간단하지 않습니다. 일반적인 솔루션은 기본 로드 컨텍스트로만 로드되는 어셈블리에 정의된 인터페이스를 사용하는 것입니다.
.NET