System.Runtime.Loader.AssemblyLoadContext classe
Este artigo fornece observações complementares à documentação de referência para essa API.
O AssemblyLoadContext representa um contexto de carga. Conceitualmente, um contexto de carregamento cria um escopo para carregar, resolver e potencialmente descarregar um conjunto de assemblies.
O AssemblyLoadContext existe principalmente para fornecer isolamento de carregamento de montagem. Ele permite que várias versões do mesmo assembly sejam carregadas dentro de um único processo. Ele substitui os mecanismos de isolamento fornecidos por várias AppDomain instâncias no .NET Framework.
Observação
- AssemblyLoadContext não fornece nenhum recurso de segurança. Todo o código tem permissões completas do processo.
- Somente no .NET Core 2.0 - 2.2, AssemblyLoadContext é uma classe abstrata. Para criar uma classe concreta nessas versões, implemente o AssemblyLoadContext.Load(AssemblyName) método.
Uso no tempo de execução
O tempo de execução implementa dois contextos de carga de assembly:
- AssemblyLoadContext.Default Representa o contexto padrão do tempo de execução, que é usado para o assembly principal do aplicativo e suas dependências estáticas.
- O Assembly.LoadFile(String) método isola os assemblies carregados instanciando o AssemblyLoadContextarquivo . Ele tem um esquema de isolamento simplista que carrega cada assembly em seu próprio AssemblyLoadContext sem resolução de dependência.
Uso do aplicativo
Um aplicativo pode criar seu próprio AssemblyLoadContext para criar uma solução personalizada para cenários avançados. A personalização se concentra na definição de mecanismos de resolução de dependência.
O AssemblyLoadContext fornece dois pontos de extensão para implementar a resolução de assembly gerenciado:
- O AssemblyLoadContext.Load(AssemblyName) método fornece a primeira chance para o resolver, carregar e retornar o AssemblyLoadContext assembly. Se o método retornar
null
, o carregador tentará carregar o AssemblyLoadContext.Load(AssemblyName) assembly no AssemblyLoadContext.Default. - Se o não conseguir resolver a montagem, o AssemblyLoadContext.Default original AssemblyLoadContext terá uma segunda chance de resolver a montagem. O tempo de execução gera o Resolving evento.
Além disso, o AssemblyLoadContext.LoadUnmanagedDll(String) método virtual permite a personalização da resolução de assembly não gerenciado padrão. A implementação padrão retorna null
, o que faz com que a pesquisa em tempo de execução use sua política de pesquisa padrão. A política de pesquisa padrão é suficiente para a maioria dos cenários.
Desafios técnicos
Não é possível carregar várias versões do tempo de execução em um único processo.
Cuidado
Carregar várias cópias ou versões diferentes de assemblies de estrutura pode levar a um comportamento inesperado e difícil de diagnosticar.
Dica
Use limites de processo com comunicação remota ou entre processos para resolver esse problema de isolamento.
O tempo de carregamento da montagem pode dificultar o teste e a depuração. Normalmente, os assemblies são carregados sem que suas dependências sejam resolvidas imediatamente. As dependências são carregadas conforme necessário:
- Quando o código se ramifica em um assembly dependente.
- Quando o código carrega recursos.
- Quando o código carrega explicitamente assemblies.
A implementação de pode adicionar novas dependências que talvez precisem ser isoladas para permitir a existência de AssemblyLoadContext.Load(AssemblyName) versões diferentes. A implementação mais natural colocaria essas dependências no contexto padrão. Um design cuidadoso pode isolar as novas dependências.
O mesmo assembly é carregado várias vezes em contextos diferentes.
- Isso pode levar a mensagens de erro confusas, por exemplo, "Não é possível converter objeto do tipo 'Sample.Plugin' para digitar 'Sample.Plugin'".
- Cruzar fronteiras de isolamento não é trivial. Uma solução típica é usar uma interface definida em um assembly que é carregado apenas no contexto de carregamento padrão.