System.Runtime.Loader.AssemblyLoadContext classe

Observação

Este artigo fornece observações 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 fornecer isolamento de carregamento de assemblies. 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

Utilização no tempo de execução

O tempo de execução implementa dois contextos de carga de assembly:

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 centra-se na definição de mecanismos de resolução de dependências.

O AssemblyLoadContext fornece dois pontos de extensão para implementar a resolução de assemblagem gerida:

  1. O método AssemblyLoadContext.Load(AssemblyName) oferece ao AssemblyLoadContext a primeira oportunidade para resolver, carregar e devolver o assembly. Se o AssemblyLoadContext.Load(AssemblyName) método retornar null, o carregador tentará carregar o conjunto no AssemblyLoadContext.Default.
  2. Se o AssemblyLoadContext.Default não conseguir resolver a montagem, o original AssemblyLoadContext terá uma segunda chance de resolver a montagem. O tempo de execução gera o Resolving evento.

Além disso, o método virtual AssemblyLoadContext.LoadUnmanagedDll(String) permite a personalização da resolução padrão de assembly não gerenciado. 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.

    Atenção

    Carregar várias cópias ou versões diferentes de assemblies de estrutura pode levar a um comportamento inesperado e difícil de diagnosticar.

    Sugestão

    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, as assemblagens são carregadas sem que as suas dependências sejam resolvidas imediatamente. As dependências são carregadas conforme necessário:

    • Quando o código se ramifica em uma assemblagem dependente.
    • Quando o código carrega recursos.
    • Quando o código carrega explicitamente assemblagens.
  • A implementação de AssemblyLoadContext.Load(AssemblyName) pode adicionar novas dependências que podem precisar ser isoladas para permitir que diferentes versões existam. A implementação mais natural colocaria essas dependências no contexto padrão. Um design cuidadoso pode isolar as novas dependências.

  • O mesmo módulo é 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 o tipo 'Sample.Plugin'".
    • O marshaling de dados através dos limites de isolamento não é uma tarefa simples. Uma solução típica é usar uma interface definida numa assembly que só é carregada no contexto de carregamento padrão.