Algoritmo de carregamento de assembly gerenciado

Os assemblies gerenciados são localizados e carregados com um algoritmo que tem vários estágios.

Todos os assemblies gerenciados, exceto assemblies satélites e assemblies WinRT, usam o mesmo algoritmo.

Quando os assemblies gerenciados são carregados?

O mecanismo mais comum para disparar uma carga de assembly gerenciado é uma referência de assembly estático. Essas referências são inseridas pelo compilador sempre que o código usa um tipo definido em outro assembly. Esses assemblies são carregados (load-by-name) conforme necessário pelo runtime. O momento exato em que as referências de assembly estático são carregadas não é especificado. Ele pode variar de acordo com a versão de runtime e é influenciado por otimizações como inlining.

O uso direto das seguintes APIs também disparará cargas:

API Descrição Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name A instância this.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Carregar do caminho. A instância this.
AssemblyLoadContext.LoadFromStream Carregar do objeto. A instância this.
Assembly.LoadFile Carregar do caminho em uma nova instância AssemblyLoadContext A nova instância AssemblyLoadContext.
Assembly.LoadFrom Carregue do caminho na instância AssemblyLoadContext.Default.
Adiciona um manipulador de AppDomain.AssemblyResolve. O manipulador carregará as dependências do assembly de seu diretório.
A instância AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Inferido do chamador.
Prefira métodos AssemblyLoadContext.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Carregar do objeto em uma nova instância AssemblyLoadContext. A nova instância AssemblyLoadContext.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Inferido do chamador.
Prefira métodos Type.GetType com um argumento assemblyResolver.
Assembly.GetType Se o tipo name descrever um tipo genérico qualificado de assembly, dispare um Load-by-name. Inferido do chamador.
Prefira Type.GetType ao usar nomes de tipo qualificados de assembly.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Inferido do chamador.
Prefira métodos Activator.CreateInstance com um argumento Type.

Algoritmo

O algoritmo a seguir descreve como o runtime carrega um assembly gerenciado.

  1. Determinar o activeAssemblyLoadContext.

  2. Para os métodos Load-by-name, o activeAssemblyLoadContext carrega o assembly na seguinte ordem de prioridade:

  3. Para os outros tipos de cargas, o activeAssemblyLoadContext carrega o assembly na seguinte ordem de prioridade:

    • Verifique seu cache-by-name.
    • Carregue do caminho especificado ou do objeto de assembly bruto. Se um assembly for recém-carregado, uma referência será adicionada à instância cache-by-name de activeAssemblyLoadContext.
  4. Em ambos os casos, se um assembly for carregado recentemente, o evento AppDomain.AssemblyLoad será gerado.