Visão Geral Sobre Domínios de Aplicativos
Historicamente, os limites de processo têm sido usados para isolar aplicativos em execução no mesmo computador.Cada aplicativo é carregado em um processo separado, que isola o aplicativo de outros aplicativos em execução no mesmo computador.
Os aplicativos são isolados porque endereços de memória são relativos a processos; um ponteiro de memória passado de um processo para outro não pode ser usado de qualquer maneira significativa no processo de destino.Além disso, você não pode fazer chamadas diretas entre dois processos.Em vez disso, você deve usar proxies, que fornecem um nível de engano (abstração).
Código gerenciado deve ser passado através de um processo de verificação antes que possa ser executado (a menos que o administrador tenha concedido permissão para ignorar a verificação).O processo de verificação determina se o código pode tentar acessar endereços de memória inválidos ou realizar alguma outra ação que pode causar falha no processo no qual ele está executando.O código que passa pelo teste de verificação é dito ser com segurança de tipos.A capacidade para verificar o código como com segurança de tipos permite ao Common Language Runtime fornecer um nível de isolamento como o limite de processo, com um custo de desempenho muito menor.
Domínios de aplicativo oferecem uma unidade mais segura e versátil de processamento que o Common Language Runtime pode usar para fornecer isolamento entre aplicativos.Você pode executar vários domínios de aplicativo em um único processo com o mesmo nível de isolamento que deve existir em processos separados, mas sem incorrer em sobrecarga adicional ao fazer chamadas ou alternar entre processos.A capacidade para executar vários aplicativos em um único processo aumenta bastante a escalabilidade do servidor.
Isolar aplicativos também é importante para segurança do aplicativo.Por exemplo, você pode executar controles de vários aplicativos Web em um processo navegador único de tal forma que os controles não podem acessar dados e recursos uns dos outros.
O isolamento fornecido pelos domínios de aplicativo possui os seguintes benefícios:
Falhas em um aplicativo não podem afetar outros aplicativos.Como um código com segurança de tipos não pode causar falhas de memória, usar domínios de aplicativo garante que o código em execução em um domínio não pode afetar outros aplicativos no processo.
Aplicativos individuais podem ser interrompidos sem interromper o processo inteiro.Usar domínios de aplicativo permite que você descarregue o código sendo executado em um único aplicativo.
Observação: Você não pode descarregar assemblies individuais ou tipos.Apenas um domínio completo pode ser descarregado.
Código em execução em um aplicativo não pode diretamente acessar código ou recursos de outro aplicativo.O Common Language Runtime aplica esse isolamento, impedindo chamadas diretas entre objetos em domínios de aplicativo diferentes.Objetos que passam entre domínios são copiados ou acessados por proxy.Se o objeto é copiado, a chamada para o objeto é local.Isto é, tanto o chamador quanto o objeto sendo referenciado estão no mesmo domínio de aplicativo.Se o objeto é acessado através de um proxy, a chamada para o objeto é remota.Nesse caso, o chamador e o objeto sendo referenciado estão em domínios diferentes.Chamadas entre domínios usam a mesma infraestrutura de chamada remota entre dois processos ou entre dois computadores.Assim, os metadados para o objeto sendo referenciado deve estar disponível para ambos os domínios de aplicativo para permitir que a chamada de método seja JIT.Se o domínio de chamada não tem acesso aos metadados para o objeto sendo chamado, a compilação pode falhar com uma exceção de tipo System.IO.FileNotFound.Para obter mais detalhes, consulte .NET Remoting.O mecanismo para determinar como objetos podem ser acessados em domínios é determinado pelo objeto.Para mais informações, consulte Classe MarshalByRefObject.
O escopo do comportamento do código é dado pelo aplicativo no qual ele é executado.Em outras palavras, o domínio do aplicativo fornece configurações como as políticas de versão da aplicação, a localidade de qualquer assemblies remotos que ele acessa, e informações sobre onde localizar assemblies que são carregados no domínio.
Permissões concedidas ao código podem ser controladas pelo domínio do aplicativo no qual o código está sendo executado.