관리되는 어셈블리는 다양한 단계가 있는 알고리즘을 사용하여 배치되고 로드됩니다.
위성 어셈블리 및 WinRT 어셈블리를 제외한 모든 관리되는 어셈블리는 동일한 알고리즘을 사용합니다.
관리되는 어셈블리는 언제 로드되나요?
관리되는 어셈블리 로드를 트리거하는 가장 일반적인 메커니즘은 정적 어셈블리 참조입니다. 이러한 참조는 코드가 다른 어셈블리에 정의된 형식을 사용할 때마다 컴파일러에 의해 삽입됩니다. 이러한 어셈블리는 런타임에 필요에 따라 로드됩니다(load-by-name). 정적 어셈블리 참조가 로드되는 정확한 타이밍은 지정되지 않습니다. 런타임 버전마다 다를 수 있으며 인라인 처리와 같은 최적화의 영향을 받습니다.
다음 API를 직접 사용하면 로드도 트리거됩니다.
중요합니다
.NET Framework와 assemblyFile 달리 매개 변수 Assembly.LoadFrom 는 URI가 아닌 .NET의 파일 경로로 처리됩니다. .NET Framework에서는 파일 URI(예를 들어, file:///C:/path/to/assembly.dll—Assembly.CodeBase를 사용하여 생성된 것)를 전달할 수 있으며, 어셈블리를 성공적으로 로드할 수 있습니다. .NET에서 assemblyFile 값이 URI를 제대로 처리하지 못하는 Path.GetFullPath으로 전달되어 로드가 실패합니다. 파일 URI 문자열이 이미 있는 경우 먼저 인스턴스를 Uri 만들고 호출하기 전에 LocalPath해당 Assembly.LoadFrom 속성을 사용하여 파일 경로를 가져옵니다. 이미 로드된 어셈블리의 파일 경로를 얻으려면 CodeBase 대신 Assembly.Location을(를) 사용하세요.
알고리즘
다음 알고리즘은 런타임이 관리되는 어셈블리를 로드하는 방법을 설명합니다.
를 확인합니다
activeAssemblyLoadContext.- 정적 어셈블리 참조의
activeAssemblyLoadContext 경우 참조 어셈블리를 로드한 인스턴스입니다. - 선호하는 API는
activeAssemblyLoadContext를 명시적으로 만듭니다. - 다른 API들은
activeAssemblyLoadContext를 유추합니다. 이 API에서는 AssemblyLoadContext.CurrentContextualReflectionContext 속성이 사용됩니다. 값이null면 유추된 AssemblyLoadContext 인스턴스가 사용됩니다. - 관리되는 어셈블리가 로드되는 시기 섹션의 표를 참조하세요.
- 정적 어셈블리 참조의
메서드
Load-by-name의 경우activeAssemblyLoadContext는 어셈블리를 다음 우선 순위 순서로 로드합니다.- 확인하세요
cache-by-name. - AssemblyLoadContext.Load 함수를 호출합니다.
- 인스턴스의 캐시를 AssemblyLoadContext.Default 확인하고 관리되는 어셈블리 기본 검색 논리를 실행합니다. 어셈블리가 새로 로드되면 AssemblyLoadContext.Default 인스턴스의
cache-by-name에 참조가 추가됩니다. - AssemblyLoadContext.Resolving 활성 AssemblyLoadContext에 대한 이벤트를 트리거합니다.
- AppDomain.AssemblyResolve 이벤트를 발생시킵니다.
- 확인하세요
다른 유형의 로드의 경우 어셈블리를
activeAssemblyLoadContext 다음 우선 순위 순서로 로드합니다.- 확인하세요
cache-by-name. -
activeAssemblyLoadContext이 AssemblyLoadContext.Default이면 관리되는 어셈블리에 대한 기본 검색 논리를 실행합니다. - 지정된 경로 또는 원시 어셈블리 개체에서 로드합니다. 어셈블리가 새로 로드되면 인스턴스
active에 참조가 AssemblyLoadContextcache-by-name추가됩니다.
- 확인하세요
두 경우 모두 어셈블리가 새로 로드되면 AppDomain.AssemblyLoad 이벤트가 발생합니다.
.NET