관리되는 어셈블리는 다양한 단계가 있는 알고리즘을 사용하여 배치되고 로드됩니다.
위성 어셈블리 및 WinRT
어셈블리를 제외한 모든 관리되는 어셈블리는 동일한 알고리즘을 사용합니다.
관리되는 어셈블리는 언제 로드되나요?
관리되는 어셈블리 로드를 트리거하는 가장 일반적인 메커니즘은 정적 어셈블리 참조입니다. 이러한 참조는 코드가 다른 어셈블리에 정의된 형식을 사용할 때마다 컴파일러에 의해 삽입됩니다. 이러한 어셈블리는 런타임에 필요에 따라 로드됩니다(load-by-name
). 정적 어셈블리 참조가 로드되는 정확한 타이밍은 지정되지 않습니다. 런타임 버전마다 다를 수 있으며 인라인 처리와 같은 최적화의 영향을 받습니다.
다음 API를 직접 사용하면 로드도 트리거됩니다.
알고리즘
다음 알고리즘은 런타임이 관리되는 어셈블리를 로드하는 방법을 설명합니다.
를 확인합니다
active
AssemblyLoadContext.- 정적 어셈블리 참조의
active
AssemblyLoadContext 경우 참조 어셈블리를 로드한 인스턴스입니다. - 선호하는 API는
active
AssemblyLoadContext를 명시적으로 만듭니다. - 다른 API들은
active
AssemblyLoadContext를 유추합니다. 이 API에서는 AssemblyLoadContext.CurrentContextualReflectionContext 속성이 사용됩니다. 값이null
면 유추된 AssemblyLoadContext 인스턴스가 사용됩니다. - 관리되는 어셈블리가 로드되는 시기 섹션의 표를 참조하세요.
- 정적 어셈블리 참조의
메서드
Load-by-name
의 경우active
AssemblyLoadContext는 어셈블리를 다음 우선 순위 순서로 로드합니다.- 확인하세요
cache-by-name
. - AssemblyLoadContext.Load 함수를 호출합니다.
- 인스턴스의 캐시를 AssemblyLoadContext.Default 확인하고 관리되는 어셈블리 기본 검색 논리를 실행합니다. 어셈블리가 새로 로드되면 AssemblyLoadContext.Default 인스턴스의
cache-by-name
에 참조가 추가됩니다. - AssemblyLoadContext.Resolving 활성 AssemblyLoadContext에 대한 이벤트를 트리거합니다.
- AppDomain.AssemblyResolve 이벤트를 발생시킵니다.
- 확인하세요
다른 유형의 로드의 경우 어셈블리를
active
AssemblyLoadContext 다음 우선 순위 순서로 로드합니다.- 확인하세요
cache-by-name
. - 지정된 경로 또는 원시 어셈블리 개체에서 로드합니다. 어셈블리가 새로 로드되면 인스턴스
active
에 참조가 AssemblyLoadContextcache-by-name
추가됩니다.
- 확인하세요
두 경우 모두 어셈블리가 새로 로드되면 AppDomain.AssemblyLoad 이벤트가 발생합니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET