관리 어셈블리 로드 알고리즘
관리 어셈블리는 다양한 단계의 알고리즘을 통해 찾아 로드됩니다.
위성 어셈블리 및 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에 대해 AssemblyLoadContext.Resolving 이벤트를 발생시킵니다.
- AppDomain.AssemblyResolve 이벤트를 발생시킵니다.
- 해당
다른 형식의 로드의 경우
active
AssemblyLoadContext는 다음 우선 순위에 따라 어셈블리를 로드합니다.- 해당
cache-by-name
을 확인합니다. - 지정된 경로 또는 원시 어셈블리 개체에서 로드합니다. 어셈블리가 새로 로드되는 경우
active
AssemblyLoadContext 인스턴스의cache-by-name
에 참조가 추가됩니다.
- 해당
두 경우 모두 어셈블리가 새로 로드되면 AppDomain.AssemblyLoad 이벤트가 발생합니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET