Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 conjuntos 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:
Importante
Ao contrário do .NET Framework, o parâmetro assemblyFile de Assembly.LoadFrom é tratado como um caminho de arquivo no .NET, não como um URI. No .NET Framework, você pode passar um URI de arquivo (por exemplo, file:///C:/path/to/assembly.dll), como um construído a partir de Assembly.CodeBase— e o assembly é carregado com êxito. No .NET, o assemblyFile valor é passado para Path.GetFullPath, que não manipula corretamente URIs, de modo que a carga falha. Se você já tiver uma cadeia de caracteres de URI de arquivo, primeiro crie uma Uri instância e use sua LocalPath propriedade para obter o caminho do arquivo antes de chamar Assembly.LoadFrom. Para obter o caminho do arquivo de um assembly já carregado, use Assembly.Location em vez de CodeBase.
Algoritmo
O algoritmo a seguir descreve como o runtime carrega um assembly gerenciado.
Determinar o
activeAssemblyLoadContext.- Para uma referência de assembly estático, a
activeAssemblyLoadContext é a instância que carregou o assembly de referência. - APIs preferidas tornam o
activeAssemblyLoadContext explícito. - Outras APIs inferem o
activeAssemblyLoadContext. Para essas APIs, a AssemblyLoadContext.CurrentContextualReflectionContext propriedade é usada. Se o valor fornull, então a instância inferida AssemblyLoadContext é usada. - Consulte a tabela na seção Quando assemblies gerenciados são carregados?
- Para uma referência de assembly estático, a
Para os métodos
Load-by-name, oactiveAssemblyLoadContext 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 AssemblyLoadContext.Default da instância
cache-by-name. - Gere o evento AssemblyLoadContext.Resolving para o AssemblyLoadContext ativo.
- Aciona o evento AppDomain.AssemblyResolve.
- Verifique seu
Para os outros tipos de cargas, a montagem
activeAssemblyLoadContext é carregada na seguinte ordem de prioridade:- Verifique seu
cache-by-name. - Se o
activeAssemblyLoadContext estiver AssemblyLoadContext.Default, execute à lógica de investigação padrão para assemblies gerenciados. - Carregue do caminho especificado ou do objeto de assembly bruto. Se um assembly for recém-carregado, uma referência será adicionada a
activeda instância AssemblyLoadContextcache-by-name.
- Verifique seu
Em ambos os casos, se um assembly for carregado recentemente, o evento AppDomain.AssemblyLoad será gerado.