Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. 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 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:
Importante
Ao contrário do .NET Framework, o assemblyFile parâmetro de Assembly.LoadFrom é tratado como um caminho de ficheiro no .NET, não como um URI. No .NET Framework, pode passar um URI de ficheiro (por exemplo, file:///C:/path/to/assembly.dll)—como um construído a partir de Assembly.CodeBase—e o assembly carrega-se com sucesso. No .NET, o assemblyFile valor é passado para Path.GetFullPath, que não trata corretamente os URIs, pelo que o carregamento falha. Se já tem uma cadeia de URI de ficheiro, crie primeiro uma Uri instância e use a sua LocalPath propriedade para obter o caminho do ficheiro antes de chamar Assembly.LoadFrom. Para obter o caminho do ficheiro de um assembly já carregado, use Assembly.Location em vez de CodeBase.
Algoritmo
O algoritmo a seguir descreve como o ambiente de execução carrega um conjunto gerenciado.
Determine o
activeAssemblyLoadContext.- Para uma referência estática de assembly, o
activeAssemblyLoadContext é a instância que carregou o assembly referido. - As APIs preferidas tornam o
activeAssemblyLoadContext explícito. - Outras APIs inferem o
activeAssemblyLoadContext. 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 estática de assembly, o
Para os
Load-by-namemétodos, oactiveAssemblyLoadContext carrega o conjunto na seguinte ordem de prioridade:- Verifique o
cache-by-name. - Chame a função AssemblyLoadContext.Load.
- Verifique o cache da AssemblyLoadContext.Default instância e execute a lógica padrão de sondagem do assembly gerenciado. Se um assembly for recentemente carregado, uma referência será adicionada à instância de AssemblyLoadContext.Default
cache-by-name. - Levante o AssemblyLoadContext.Resolving evento para o AssemblyLoadContext ativo.
- Levante o AppDomain.AssemblyResolve evento.
- Verifique o
Para os outros tipos de cargas, o
activeAssemblyLoadContext carrega o conjunto na seguinte ordem de prioridade:- Verifique o
cache-by-name. - Se for
activeAssemblyLoadContextAssemblyLoadContext.Default, execute a lógica de sondagem padrão para assemblies geridos. - 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.
- Verifique o
Em ambos os casos, se um assembly for recém-carregado, então o evento AppDomain.AssemblyLoad será gerado.