Compartilhar via


Domínios de Aplicativos e Assemblies

Este tópico descreve o relacionamento entre domínios de aplicativos e assemblies.Você deve carregar um assembly em um domínio de aplicativo antes de executar o código que ele contém.Executar um aplicativo típico faz com vários assemblies sejam carregados em um domínio de aplicativo.

A forma pela qual um assembly é carregado determina se o seu código compilado por just-in-time (JIT) pode ser compartilhado por vários domínios de aplicativos no processo, e se o conjunto pode ser descarregado do processo.

  • Se um assembly for carregado em domínio neutro, todos os domínios de aplicativos que compartilham a mesma concessão de segurança podem compartilhar o mesmo código compilado por JIT, o que reduz a memória necessária para o aplicativo.No entanto, o assembly nunca pode ser descarregado do processo.

  • Se um assembly não for carregado em domínio neutro, ele deverá ser compilado por JIT em cada domínio de aplicativo no qual ele for carregado.No entanto, o assembly pode ser descarregado do processo descarregando todos os domínios de aplicativo no qual ele está carregado.

O host de tempo de execução decidirá se carregará os assemblies como neutros com relação ao domínio quando ele carregar o runtime em um processo.Para aplicativos gerenciados, aplique o atributo LoaderOptimizationAttribute para o método de ponto de entrada para o processo, e especifique um valor da enumeração LoaderOptimization associada.Para aplicativos não gerenciados que hospedam o Common Language Runtime, especifique o sinalizador apropriado ao chamar o método Função CorBindToRuntimeEx.

Há três opções para carregar assemblies domain-neutral:

  • SingleDomain não carrega assemblies como neutros em relação ao domínio, exceto Mscorlib, que é sempre carregado como neutro em relação ao domínio.Esta configuração é chamada de domínio único, porque ela é normalmente usada quando o host está executando apenas um único aplicativo em um processo.

  • MultiDomain carregar todos os assemblies como neutros em relação ao domínio.Use esta configuração quando existirem vários domínios de aplicativo no processo, os quais executam o mesmo código.

  • MultiDomainHost carrega assemblies de nome forte como neutros em relação ao domínio, se eles e todas as suas dependências foram instalados na cache global de assemblies.Outros assemblies são carregados e compilados por JIT separadamente para cada domínio de aplicativo no qual eles são carregados e, portanto, podem ser descarregados do processo.Use esta configuração ao executar mais de um aplicativo no mesmo processo, ou se você tiver uma mistura de assemblies que são compartilhados por vários domínios de aplicativos e assemblies que precisam ser descarregados do processo.

Códigos compilados por JIT não podem ser compartilhados por assemblies carregados no contexto de carga, usando o método LoadFrom da classe Assembly, ou carregados de imagens usando sobrecargas do método Load que especificam matrizes de bytes.

Assemblies que foram compilados para código nativo usando o Nativo Gerador de Imagem (Ngen.exe) podem ser compartilhados entre domínios de aplicativos, se eles forem carregados como neutros em relação ao domínio na primeira vez que eles forem carregados em um processo.

Códigos compilados por JIT para o assembly que contém o ponto de entrada do aplicativo são compartilhados somente se todas as suas dependências puderem ser compartilhadas.

Um assembly neutro em relação ao domínio pode ser compilado por JIT mais de uma vez.Por exemplo, quando as definições de concessão de segurança de dois domínios de aplicativos forem diferentes, eles não podem compartilhar o mesmo código compilado por JIT.No entanto, cada cópia do assembly compilado por JIT pode ser compartilhada com outros domínios de aplicativos que têm as mesmas definições de concessão.

Ao decidir se você deve carregar assemblies como neutros em relação ao domínio, você deve fazer uma escolha entre reduzir o uso de memória e outros fatores de desempenho.

  • O acesso a dados e métodos estáticos é mais lento para assemblies neutros em relação ao domínio devido à necessidade de isolar assemblies.Cada domínio do aplicativo que acessa o assembly deve ter uma cópia separada dos dados estáticos, para evitar que referências a objetos em campos estáticos cruzem os limites do domínio.Como resultado, o tempo de execução contém a lógica adicional para direcionar um chamador à cópia apropriada de dados estáticos ou método.Essa lógica extra diminui a chamada.

  • Todas as dependências de um assembly devem ser localizadas e carregadas quando o assembly é carregado como neutro em relação ao domínio, porque uma dependência que não puder ser carregada como neutra em relação ao domínio impede que o assembly seja carregado como neutro em relação ao domínio.

Consulte também

Outros recursos

Domínios de aplicativo

Assemblies em Common Language Runtime