Compartilhar via


Classe System.Runtime.Loader.AssemblyLoadContext

Este artigo fornece comentários complementares à documentação de referência para esta API.

O AssemblyLoadContext representa um contexto de carga. Conceitualmente, um contexto de carga cria um escopo para carregar, resolver e potencialmente descarregar um conjunto de assemblies.

O AssemblyLoadContext existe principalmente para oferecer isolamento de carregamento de assembly. Ele permite que várias versões do mesmo assembly sejam carregadas em um único processo. Ele substitui os mecanismos de isolamento fornecidos por várias AppDomain instâncias no .NET Framework.

Observação

Uso no tempo de execução

O runtime possui dois contextos para carregamento de assemblies.

Utilização da aplicação

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:

  1. O método AssemblyLoadContext.Load(AssemblyName) fornece a primeira oportunidade para que o AssemblyLoadContext resolva, carregue e retorne o assembly. Se o método AssemblyLoadContext.Load(AssemblyName) retornar null, o carregador tentará carregar o assembly no AssemblyLoadContext.Default.
  2. Se AssemblyLoadContext.Default não conseguir resolver a montagem, o original AssemblyLoadContext terá uma segunda chance de resolver a montagem. O runtime gera o evento Resolving.

Além disso, o método virtual AssemblyLoadContext.LoadUnmanagedDll(String) viabiliza a personalização da resolução de assembly não gerenciada padrão. A implementação padrão retorna null, o que faz com que a pesquisa de runtime 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 runtime 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 do assembly pode dificultar o teste e a depuração. Geralmente, 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 assemblies explicitamente.
  • A implementação de AssemblyLoadContext.Load(AssemblyName) pode adicionar novas dependências que talvez precisem ser isoladas para permitir que diferentes versões existam. A implementação mais natural colocaria essas dependências no contexto padrão. O design cuidadoso pode isolar as novas dependências.

  • O mesmo conjunto é carregado várias vezes em diferentes contextos.

    • Isso pode levar a mensagens de erro confusas, por exemplo "Não é possível converter o objeto do tipo 'Sample.Plugin' para o tipo 'Sample.Plugin'".
    • O marshaling entre limites de isolamento não é trivial. Uma solução típica é usar uma interface definida em um assembly que só é carregada no contexto de carga padrão.