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:
Algoritmo
O algoritmo a seguir descreve como o tempo de execução carrega um assembly gerenciado.
Determine o
active
AssemblyLoadContextarquivo .- Para uma referência de assembly estático, o
active
AssemblyLoadContext é a instância que carregou o assembly de referência. - As APIs preferidas tornam o
active
AssemblyLoadContext explícito. - Outras APIs inferem o
active
AssemblyLoadContext. Para essas APIs, a AssemblyLoadContext.CurrentContextualReflectionContext propriedade é usada. Se seu valor fornull
, a instância inferida AssemblyLoadContext será usada. - Consulte a tabela na seção Quando os assemblies gerenciados são carregados?
- Para uma referência de assembly estático, o
Para os
Load-by-name
métodos, oactive
AssemblyLoadContext carrega o conjunto na seguinte ordem de prioridade:- Verifique o seu
cache-by-name
. - Chame a AssemblyLoadContext.Load função.
- Verifique o cache da instância e execute a AssemblyLoadContext.Default lógica de sondagem padrão do assembly gerenciado. Se um assembly for carregado recentemente, uma referência será adicionada AssemblyLoadContext.Default
cache-by-name
ao arquivo . - Levante o AssemblyLoadContext.Resolving evento para o AssemblyLoadContext ativo.
- Levante o AppDomain.AssemblyResolve evento.
- Verifique o seu
Para os outros tipos de cargas, o
active
AssemblyLoadContext 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
active
AssemblyLoadContextcache-by-name
ao arquivo .
- Verifique o seu
Em ambos os casos, se um assembly for carregado recentemente, o AppDomain.AssemblyLoad evento será gerado.