AssemblyLoadContext Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa o conceito do runtime de um escopo para carregamento de assembly.
public ref class AssemblyLoadContext
public ref class AssemblyLoadContext abstract
public class AssemblyLoadContext
public abstract class AssemblyLoadContext
type AssemblyLoadContext = class
Public Class AssemblyLoadContext
Public MustInherit Class AssemblyLoadContext
- Herança
-
AssemblyLoadContext
Comentários
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.
Note
- AssemblyLoadContext não fornece recursos 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 runtime possui dois contextos para carregamento de assemblies.
- AssemblyLoadContext.Default representa o contexto padrão do runtime, que é usado para o assembly principal do aplicativo e suas dependências estáticas.
- O método Assembly.LoadFile(String) isola os assemblies que carrega instanciando o AssemblyLoadContext mais básico. Ele tem um esquema de isolamento simplista que carrega cada assembly em seu próprio AssemblyLoadContext sem resolução de dependência.
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:
- 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. - 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.
Caution
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.
Construtores
| Nome | Description |
|---|---|
| AssemblyLoadContext() |
Inicializa uma nova instância da classe AssemblyLoadContext. |
| AssemblyLoadContext(Boolean) |
Inicializa uma nova instância da AssemblyLoadContext classe com um valor que indica se o descarregamento está habilitado. |
| AssemblyLoadContext(String, Boolean) |
Inicializa uma nova instância da AssemblyLoadContext classe com um nome e um valor que indica se o descarregamento está habilitado. |
Propriedades
| Nome | Description |
|---|---|
| All |
Retorna uma coleção de todas as AssemblyLoadContext instâncias. |
| Assemblies |
Retorna uma coleção das Assembly instâncias carregadas no AssemblyLoadContext. |
| CurrentContextualReflectionContext |
Obtém o AssemblyLoadContext conjunto pela chamada mais recente para EnterContextualReflection(). |
| Default |
Obtém o padrão AssemblyLoadContext. O contexto padrão contém o assembly de aplicativo principal e suas dependências estáticas. |
| IsCollectible |
Obtém um valor que indica se isso AssemblyLoadContext é colecionável. |
| Name |
Obtenha o nome do AssemblyLoadContext. |
Métodos
| Nome | Description |
|---|---|
| EnterContextualReflection() |
Define CurrentContextualReflectionContext como |
| EnterContextualReflection(Assembly) |
Define CurrentContextualReflectionContext para o AssemblyLoadContext que carregou o assembly. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| Finalize() |
Permite que o objeto tente liberar recursos e executar outras operações de limpeza antes de ser recuperado pela coleta de lixo. |
| GetAssemblyName(String) |
Obtém um AssemblyName para um caminho de assembly. |
| GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
| GetLoadContext(Assembly) |
Obtém o AssemblyLoadContext que contém o especificado Assembly. |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| Load(AssemblyName) |
Quando substituído em uma classe derivada, permite que um assembly seja resolvido com base em sua AssemblyName. |
| LoadFromAssemblyName(AssemblyName) |
Resolve e carrega um assembly dado o seu AssemblyName. |
| LoadFromAssemblyPath(String) |
Carrega o conteúdo de um arquivo de assembly no caminho especificado. |
| LoadFromNativeImagePath(String, String) |
Carrega o conteúdo da imagem nativa de um arquivo de assembly gerenciado no caminho especificado. |
| LoadFromStream(Stream, Stream) |
Carrega o assembly com uma imagem baseada em COFF (formato de arquivo de objeto comum) que contém um assembly gerenciado, opcionalmente incluindo símbolos para o assembly. |
| LoadFromStream(Stream) |
Carrega o assembly com uma imagem baseada em COFF (formato de arquivo de objeto comum) que contém um assembly gerenciado. |
| LoadUnmanagedDll(String) |
Permite que a classe derivada carregue uma biblioteca não gerenciada por nome. |
| LoadUnmanagedDllFromPath(String) |
Carrega uma biblioteca não gerenciada do caminho especificado. |
| MemberwiseClone() |
Cria uma cópia superficial do Objectatual. (Herdado de Object) |
| SetProfileOptimizationRoot(String) |
Define o caminho raiz em que os perfis de otimização para esse contexto de carga são armazenados. |
| StartProfileOptimization(String) |
Inicia a otimização de perfil para o perfil especificado. |
| ToString() |
Retorna a representação de cadeia de caracteres desse contexto de carga. |
| ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
| Unload() |
Inicia um descarregamento deste AssemblyLoadContext. |
Eventos
| Nome | Description |
|---|---|
| Resolving |
Ocorre quando a resolução de um assembly falha ao tentar carregar nesse contexto de carga do assembly. |
| ResolvingUnmanagedDll |
Ocorre quando a resolução de uma biblioteca nativa falha. |
| Unloading |
Ocorre quando o AssemblyLoadContext é descarregado. |