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

관리 어셈블리는 다양한 단계의 알고리즘을 통해 찾아 로드됩니다.

위성 어셈블리 및 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. 호출자에서 유추됩니다.
assemblyResolver 인수를 사용하여 Type.GetType 메서드를 선택합니다.
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. 호출자에서 유추됩니다.
Type 인수를 사용하는 Activator.CreateInstance 메서드를 선택합니다.

알고리즘

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

  1. activeAssemblyLoadContext를 확인합니다.

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

  3. 다른 형식의 로드의 경우 activeAssemblyLoadContext는 다음 우선 순위에 따라 어셈블리를 로드합니다.

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