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