다음을 통해 공유


관리되는 어셈블리 로드 알고리즘

관리되는 어셈블리는 다양한 단계가 있는 알고리즘을 사용하여 배치되고 로드됩니다.

위성 어셈블리 및 WinRT 어셈블리를 제외한 모든 관리되는 어셈블리는 동일한 알고리즘을 사용합니다.

관리되는 어셈블리는 언제 로드되나요?

관리되는 어셈블리 로드를 트리거하는 가장 일반적인 메커니즘은 정적 어셈블리 참조입니다. 이러한 참조는 코드가 다른 어셈블리에 정의된 형식을 사용할 때마다 컴파일러에 의해 삽입됩니다. 이러한 어셈블리는 런타임에 필요에 따라 로드됩니다(load-by-name). 정적 어셈블리 참조가 로드되는 정확한 타이밍은 지정되지 않습니다. 런타임 버전마다 다를 수 있으며 인라인 처리와 같은 최적화의 영향을 받습니다.

다음 API를 직접 사용하면 로드도 트리거됩니다.

응용 프로그램 인터페이스 (API) 설명 Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name 인스턴스입니다.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
경로에서 로드합니다. 인스턴스입니다.
AssemblyLoadContext.LoadFromStream 개체에서 불러오기. 인스턴스입니다.
Assembly.LoadFile AssemblyLoadContext 인스턴스의 경로에서 로드 AssemblyLoadContext 인스턴스입니다.
Assembly.LoadFrom 인스턴스의 경로에서 로드합니다 AssemblyLoadContext.Default .
AppDomain.AssemblyResolve 처리기를 추가합니다. 처리기는 해당 디렉터리에서 어셈블리의 종속성을 로드합니다.
AssemblyLoadContext.Default 인스턴스입니다.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name; 호출자에서 유추됩니다.
AssemblyLoadContext 메서드를 선호합니다.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
AssemblyLoadContext 인스턴스의 개체에서 로드합니다. AssemblyLoadContext 인스턴스입니다.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name; 호출자에서 유추됩니다.
Type.GetType 메서드를 assemblyResolver 인수로 선호합니다.
Assembly.GetType 형식 name이 어셈블리 자격을 갖춘 제네릭 형식을 설명하는 경우, Load-by-name을 트리거합니다. 호출자에서 유추됩니다.
어셈블리 정규화된 형식 이름을 사용할 때는 Type.GetType을(를) 선호합니다.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name; 호출자에서 유추됩니다.
Activator.CreateInstance 인수를 취하는 Type 메서드를 선호합니다.

알고리즘

다음 알고리즘은 런타임이 관리되는 어셈블리를 로드하는 방법을 설명합니다.

  1. 를 확인합니다 activeAssemblyLoadContext.

  2. 메서드 Load-by-name의 경우 activeAssemblyLoadContext는 어셈블리를 다음 우선 순위 순서로 로드합니다.

  3. 다른 유형의 로드의 경우 어셈블리를 activeAssemblyLoadContext 다음 우선 순위 순서로 로드합니다.

    • 확인하세요 cache-by-name.
    • 지정된 경로 또는 원시 어셈블리 개체에서 로드합니다. 어셈블리가 새로 로드되면 인스턴스active에 참조가 AssemblyLoadContextcache-by-name 추가됩니다.
  4. 두 경우 모두 어셈블리가 새로 로드되면 AppDomain.AssemblyLoad 이벤트가 발생합니다.