Algoritmo de carregamento de montagem 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élite e WinRT assemblies, usam o mesmo algoritmo.

Quando os assemblies gerenciados são carregados?

O mecanismo mais comum para acionar uma carga de assembly gerenciada é uma referência de assembly estática. 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 tempo de execução. O tempo exato de quando as referências de montagem estáticas são carregadas não é especificado. Ele pode variar entre versões de tempo de execução e é influenciado por otimizações como inlining.

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

API Description Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name O presente caso.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Carregue a partir do caminho. O presente caso.
AssemblyLoadContext.LoadFromStream Carregar a partir do objeto. O presente caso.
Assembly.LoadFile Carregar a partir do caminho em uma nova AssemblyLoadContext instância A nova AssemblyLoadContext instância.
Assembly.LoadFrom Carregue do AssemblyLoadContext.Default caminho na instância.
Adiciona um AppDomain.AssemblyResolve manipulador. O manipulador carregará as dependências do assembly de seu diretório.
A AssemblyLoadContext.Default instância.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Inferido do chamador.
Prefira AssemblyLoadContext métodos.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Carregue do objeto em uma nova AssemblyLoadContext instância. A nova AssemblyLoadContext instância.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Inferido do chamador.
Prefira Type.GetType métodos com um assemblyResolver argumento.
Assembly.GetType Se type name descrever um tipo genérico qualificado de assembly, acione um Load-by-namearquivo . 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 Activator.CreateInstance métodos que usem um Type argumento.

Algoritmo

O algoritmo a seguir descreve como o tempo de execução carrega um assembly gerenciado.

  1. Determine o activeAssemblyLoadContextarquivo .

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

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

    • Verifique o seu cache-by-name.
    • Carregue a partir do caminho especificado ou do objeto de assembly bruto. Se um assembly for carregado recentemente, uma referência será adicionada activeAssemblyLoadContextcache-by-nameao arquivo .
  4. Em ambos os casos, se um assembly for carregado recentemente, o AppDomain.AssemblyLoad evento será gerado.