Partilhar via


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 conjuntos geridos, exceto conjuntos satélite e WinRT conjuntos, utilizam 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 (Interface de Programação de Aplicações) Descrição 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 de um diretório em uma nova instância AssemblyLoadContext A nova AssemblyLoadContext instância.
Assembly.LoadFrom Carregue um caminho na instância AssemblyLoadContext.Default.
Adiciona um AppDomain.AssemblyResolve manipulador. O manipulador irá carregar as dependências do assembly a partir do respetivo diretório.
A AssemblyLoadContext.Default instância.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Deduzido do chamador.
Prefira AssemblyLoadContext métodos.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Carregue do objeto numa nova AssemblyLoadContext instância. A nova AssemblyLoadContext instância.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Deduzido do chamador.
Prefere Type.GetType métodos com um assemblyResolver argumento.
Assembly.GetType Se type name descrever um tipo genérico qualificado de conjunto, acione um Load-by-name. Deduzido do chamador.
Prefira Type.GetType ao usar nomes de tipo qualificados de conjunto.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Deduzido do chamador.
Prefira Activator.CreateInstance métodos que usem um Type parâmetro.

Algoritmo

O algoritmo a seguir descreve como o ambiente de execução carrega um conjunto gerenciado.

  1. Determine o activeAssemblyLoadContext.

  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 carrega o conjunto na seguinte ordem de prioridade:

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