학습
학습 경로
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
AssemblyLoadContext 클래스는 .NET Core에서 도입되었으며 .NET Framework에서 사용할 수 없습니다. 이 문서는 AssemblyLoadContext API 설명서를 개념 정보로 보완합니다.
이 문서는 동적 로드를 구현하는 개발자, 특히 동적 로드 프레임워크 개발자와 관련이 있습니다.
모든 .NET 5 이상 및 .NET Core 애플리케이션은 AssemblyLoadContext를 암시적으로 사용합니다. 종속성을 찾고 로드하는 런타임 공급자입니다. 종속성이 로드될 때마다 AssemblyLoadContext 인스턴스가 호출되어 해당 종속성을 찾습니다.
단일 AssemblyLoadContext 인스턴스는 단순 어셈블리 이름당 정확히 하나의 Assembly 버전을 로드하는 것으로 제한됩니다. 해당 이름의 어셈블리가 이미 로드된 AssemblyLoadContext 인스턴스에 대해 어셈블리 참조가 확인되면 요청된 버전이 로드된 버전과 비교됩니다. 로드된 버전이 요청된 버전과 같거나 그 이상인 경우에만 해결이 성공합니다.
단일 AssemblyLoadContext 인스턴스가 한 버전의 어셈블리만 로드할 수 있다는 제한은 코드 모듈을 동적으로 로드할 때 발생하는 문제가 될 수 있습니다. 각 모듈은 독립적으로 컴파일되며 모듈은 Assembly의 다양한 버전에 따라 달라질 수 있습니다. 이는 서로 다른 모듈이 일반적으로 사용되는 라이브러리의 서로 다른 버전에 의존하는 경우 종종 문제가 됩니다.
동적으로 코드를 로드하도록 지원하기 위해 AssemblyLoadContext API는 동일한 애플리케이션에서 충돌하는 버전의 Assembly를 로드하는 기능을 제공합니다. 각 AssemblyLoadContext 인스턴스는 각 AssemblyName.Name을 특정 Assembly 인스턴스에 매핑하는 고유한 사전을 제공합니다.
또한 나중에 언로드하기 위해 코드 모듈과 관련된 종속성을 그룹화하는 편리한 메커니즘도 제공합니다.
AssemblyLoadContext.Default 인스턴스는 시작 시 런타임에서 자동으로 채웁니다. 기본 프로빙을 사용하여 모든 정적 종속성을 찾습니다.
가장 일반적인 종속성 로드 시나리오를 해결합니다.
AssemblyLoadContext에는 재정의할 수 있는 다양한 이벤트와 가상 함수가 있습니다.
AssemblyLoadContext.Default 인스턴스는 이벤트 재정의만 지원합니다.
관리형 어셈블리 로드 알고리즘, 위성 어셈블리 로드 알고리즘 및 비관리형(네이티브) 라이브러리 로드 알고리즘 문서에서는 사용 가능한 모든 이벤트와 가상 함수를 참조합니다. 이 문서에는 로드 알고리즘에서 각 이벤트와 함수의 상대적 위치가 나와 있습니다. 여기서는 해당 정보를 재현하지 않습니다.
이 섹션에서는 관련 이벤트 및 함수에 대한 일반 원칙에 대해 설명합니다.
null
을 반환해야 합니다. throw하면 검색을 조기에 종료하고 예외를 호출자에 전파합니다. throw는 손상된 어셈블리 또는 메모리 부족 상태와 같은 예기치 않은 오류로 제한해야 합니다.null
을 반환하고 AssemblyLoadContext.Default에서 로드를 처리할 수 있도록 하는 것이 가장 간단한 옵션일 수 있습니다.각 AssemblyLoadContext 인스턴스는 Assembly 인스턴스와 Type 정의의 고유 범위를 나타냅니다.
이러한 종속성 간에는 이진 격리가 없습니다. 이름으로 서로를 찾지 못하여 격리될 뿐입니다.
각각의 AssemblyLoadContext에서 다음을 수행할 수 있습니다.
name
형식에 대해 다른 형식 인스턴스를 반환할 수 있습니다.종속성은 AssemblyLoadContext 인스턴스 간에 쉽게 공유할 수 있습니다. 일반 모델은 하나의 AssemblyLoadContext에서 종속성을 로드하는 데 사용할 수 있습니다. 다른 하나는 로드된 어셈블리에 대한 참조를 사용하여 종속성을 공유합니다.
이 공유는 런타임 어셈블리에 필요합니다. 이러한 어셈블리는 AssemblyLoadContext.Default에만 로드할 수 있습니다. ASP.NET
, WPF
또는 WinForms
와 같은 프레임워크에도 동일하게 필요합니다.
공유 종속성을 AssemblyLoadContext.Default에 로드하는 것이 좋습니다. 이 공유는 일반적인 디자인 패턴입니다.
공유는 사용자 지정 AssemblyLoadContext 인스턴스의 코딩에서 구현됩니다. AssemblyLoadContext에는 재정의할 수 있는 다양한 이벤트와 가상 함수가 있습니다. 이러한 함수 중 하나에서 다른 AssemblyLoadContext 인스턴스에 로드된 Assembly 인스턴스에 대한 참조를 반환하면 Assembly 인스턴스가 공유됩니다. 표준 로드 알고리즘은 일반 공유 패턴을 간소화하기 위해 AssemblyLoadContext.Default의 로드를 지연시킵니다. 자세한 내용은 관리형 어셈블리 로드 알고리즘을 참조하세요.
두 AssemblyLoadContext 인스턴스에 동일한 name
의 형식 정의가 포함되는 경우 동일한 형식이 아닙니다. 이러한 형식은 동일한 Assembly 인스턴스에서 온 경우에만 동일합니다.
복잡한 문제에서 이러한 일치하지 않는 형식에 대한 예외 메시지는 혼동될 수 있습니다. 형식은 예외 메시지에서 단순 형식 이름으로 참조됩니다. 이 경우 일반적인 예외 메시지는 다음과 같은 형식입니다.
'IsolatedType' 형식의 개체를 'IsolatedType' 형식으로 변환할 수 없습니다.
일치하지 않는 형식 쌍을 지정하는 경우 다음 사항도 알고 있어야 합니다.
a
및 b
의 두 개체를 지정하는 경우 디버거에서 다음을 평가하는 것이 좋습니다.
// In debugger look at each assembly's instance, Location, and FullName
a.GetType().Assembly
b.GetType().Assembly
// In debugger look at each AssemblyLoadContext's instance and name
System.Runtime.Loader.AssemblyLoadContext.GetLoadContext(a.GetType().Assembly)
System.Runtime.Loader.AssemblyLoadContext.GetLoadContext(b.GetType().Assembly)
이러한 형식 변환 문제를 해결하기 위한 두 가지 디자인 패턴이 있습니다.
공용 공유 형식을 사용합니다. 이 공유 형식은 기본 런타임 형식이거나 새 공유 형식을 공유 어셈블리에 만들 수 있습니다. 공유 형식은 애플리케이션 어셈블리에 정의된 인터페이스인 경우가 많습니다. 자세한 내용은 종속성을 공유하는 방법을 참조하세요.
마샬링 기술을 사용하여 한 형식에서 다른 형식으로 변환합니다.
.NET 피드백
.NET은(는) 오픈 소스 프로젝트입니다. 다음 링크를 선택하여 피드백을 제공해 주세요.
학습
학습 경로
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
설명서
System.Runtime.Loader.AssemblyLoadContext 클래스 - .NET
System.Runtime.Loader.AssemblyLoadContext 클래스에 대해 알아봅니다.
관리 어셈블리 로드 알고리즘 - .NET Core - .NET
.NET Core에서 관리 어셈블리 로드 알고리즘의 세부 정보 설명
.NET에서 어셈블리 언로드 기능을 사용하고 디버그하는 방법 - .NET
수집 가능한 AssemblyLoadContext를 사용하여 관리형 어셈블리를 로드하고 언로드하는 방법과 언로드를 성공하지 못하게 하는 문제를 디버그하는 방법을 알아봅니다.
종속성을 찾기 위한 .NET Core의 System.Runtime.Loader.AssemblyLoadContext.Default 검색 논리 개요입니다.