Domínios de aplicativoApplication domains

Sistemas operacionais e ambientes em tempo de execução normalmente fornecem alguma forma de isolamento entre aplicativos.Operating systems and runtime environments typically provide some form of isolation between applications. Por exemplo, o Windows usa processos para isolar aplicativos.For example, Windows uses processes to isolate applications. Esse isolamento é necessário para garantir que o código em execução em um aplicativo não possa afetar outros aplicativos não relacionados.This isolation is necessary to ensure that code running in one application cannot adversely affect other, unrelated applications.

Domínios de aplicativos oferecem um limite de isolamento para segurança, confiabilidade e controle de versão, além de descarregar assemblies.Application domains provide an isolation boundary for security, reliability, and versioning, and for unloading assemblies. Domínios de aplicativos normalmente são criados por hosts de tempo de execução, que são responsáveis pela inicialização do Common Language Runtime antes de um aplicativo ser executado.Application domains are typically created by runtime hosts, which are responsible for bootstrapping the common language runtime before an application is run.

Os benefícios do isolamento de aplicativosThe benefits of isolating applications

Historicamente, os limites de processo têm sido usados para isolar aplicativos em execução no mesmo computador.Historically, process boundaries have been used to isolate applications running on the same computer. Cada aplicativo é carregado em um processo separado, que isola o aplicativo de outros aplicativos em execução no mesmo computador.Each application is loaded into a separate process, which isolates the application from other applications running on the same computer.

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 maneira significativa no processo de destino.The applications are isolated because memory addresses are process-relative; a memory pointer passed from one process to another cannot be used in any meaningful way in the target process. Além disso, você não pode fazer chamadas diretas entre dois processos.In addition, you cannot make direct calls between two processes. Em vez disso, você deve usar proxies, que fornecem um nível de indireção.Instead, you must use proxies, which provide a level of indirection.

O código gerenciado deve ser passado por meio de um processo de verificação antes de ser executado (a menos que o administrador tenha concedido permissão para ignorar a verificação).Managed code must be passed through a verification process before it can be run (unless the administrator has granted permission to skip the verification). 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 possa causar falha no processo no qual ele está sendo executado.The verification process determines whether the code can attempt to access invalid memory addresses or perform some other action that could cause the process in which it is running to fail to operate properly. Diz-se que o código que passa pelo teste de verificação é chamado de fortemente tipado.Code that passes the verification test is said to be type-safe. A capacidade de verificar o código como fortemente tipado permite que o Common Language Runtime forneça um ótimo nível de isolamento como o limite de processo, a um custo de desempenho muito menor.The ability to verify code as type-safe enables the common language runtime to provide as great a level of isolation as the process boundary, at a much lower performance cost.

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.Application domains provide a more secure and versatile unit of processing that the common language runtime can use to provide isolation between applications. Você pode executar vários domínios de aplicativo em um único processo com o mesmo nível de isolamento que existiria em processos separados, mas sem incorrer na sobrecarga adicional ao fazer chamadas cruzadas ou alternar processos.You can run several application domains in a single process with the same level of isolation that would exist in separate processes, but without incurring the additional overhead of making cross-process calls or switching between processes. A capacidade de executar vários aplicativos em um único processo aumenta muito a escalabilidade do servidor.The ability to run multiple applications within a single process dramatically increases server scalability.

Isolar aplicativos também é importante para a segurança do aplicativo.Isolating applications is also important for application security. Por exemplo, você pode executar controles de vários aplicativos Web em um único processo de navegador de tal forma que os controles não possam acessar dados e recursos uns dos outros.For example, you can run controls from several Web applications in a single browser process in such a way that the controls cannot access each other's data and resources.

O isolamento fornecido pelos domínios de aplicativo possui os seguintes benefícios:The isolation provided by application domains has the following benefits:

  • Falhas em um aplicativo não podem afetar outros aplicativos.Faults in one application cannot affect other applications. Como um código fortemente tipado 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 possa afetar outros aplicativos no processo.Because type-safe code cannot cause memory faults, using application domains ensures that code running in one domain cannot affect other applications in the process.

  • Aplicativos individuais podem ser interrompidos sem interromper o processo inteiro.Individual applications can be stopped without stopping the entire process. Usar domínios de aplicativo permite que você descarregue o código em execução em um único aplicativo.Using application domains enables you to unload the code running in a single application.

    Observação

    Você não pode descarregar assemblies ou tipos individuais.You cannot unload individual assemblies or types. Apenas um domínio completo pode ser descarregado.Only a complete domain can be unloaded.

  • O código em execução em um aplicativo não pode diretamente acessar o código ou os recursos de outro aplicativo.Code running in one application cannot directly access code or resources from another application. O Common Language Runtime impõe esse isolamento, impedindo chamadas diretas entre objetos em domínios de aplicativo diferentes.The common language runtime enforces this isolation by preventing direct calls between objects in different application domains. Objetos que passam entre domínios são copiados ou acessados pelo proxy.Objects that pass between domains are either copied or accessed by proxy. Se o objeto for copiado, a chamada para o objeto será local.If the object is copied, the call to the object is local. Ou seja, tanto o chamador quanto o objeto referenciado estão no mesmo domínio de aplicativo.That is, both the caller and the object being referenced are in the same application domain. Se o objeto for acessado por meio de um proxy, a chamada para o objeto será remota.If the object is accessed through a proxy, the call to the object is remote. Nesse caso, o chamador e o objeto referenciado estão em domínios diferentes.In this case, the caller and the object being referenced are in different application domains. Chamadas entre domínios usam a mesma infraestrutura de chamada remota entre dois processos ou entre dois computadores.Cross-domain calls use the same remote call infrastructure as calls between two processes or between two machines. Assim, os metadados para o objeto referenciado devem estar disponíveis para ambos os domínios de aplicativo para permitir que a chamada de método seja compilada corretamente por JIT.As such, the metadata for the object being referenced must be available to both application domains to allow the method call to be JIT-compiled properly. Se o domínio de chamada não tiver acesso aos metadados do objeto que está sendo chamado, a compilação poderá falhar com uma exceção do tipo FileNotFoundException.If the calling domain does not have access to the metadata for the object being called, the compilation might fail with an exception of type FileNotFoundException. Para obter mais informações, confira Objetos remotos.For more information, see Remote Objects. O mecanismo para determinar como objetos podem ser acessados em domínios é determinado pelo objeto.The mechanism for determining how objects can be accessed across domains is determined by the object. Para obter mais informações, consulte System.MarshalByRefObject.For more information, see System.MarshalByRefObject.

  • O escopo do comportamento do código é dado pelo aplicativo no qual ele é executado.The behavior of code is scoped by the application in which it runs. Em outras palavras, o domínio do aplicativo fornece definições de configuração, como as políticas de versão do aplicativo, o local de qualquer assembly remoto acessado e informações sobre onde localizar assemblies carregados no domínio.In other words, the application domain provides configuration settings such as application version policies, the location of any remote assemblies it accesses, and information about where to locate assemblies that are loaded into the domain.

  • Permissões concedidas ao código podem ser controladas pelo domínio do aplicativo no qual o código está sendo executado.Permissions granted to code can be controlled by the application domain in which the code is running.

Domínios de aplicativo e assembliesApplication domains and assemblies

Esta seção descreve o relacionamento entre domínios do aplicativo e assemblies.This section describes the relationship between application domains and assemblies. Você deve carregar um assembly em um domínio de aplicativo para executar o código que ele contém.You must load an assembly into an application domain before you can execute the code it contains. Executar um aplicativo típico faz vários assemblies serem carregados em um domínio de aplicativo.Running a typical application causes several assemblies to be loaded into an application domain.

A maneira como um assembly é carregado determina se o seu código compilado por JIT (just-in-time) pode ser compartilhado por vários domínios de aplicativo no processo e se o assembly pode ser descarregado do processo.The way an assembly is loaded determines whether its just-in-time (JIT) compiled code can be shared by multiple application domains in the process, and whether the assembly can be unloaded from the process.

  • Se um assembly for carregado em domínio neutro, todos os domínios de aplicativo que compartilharem o mesmo conjunto de concessões de segurança poderão compartilhar o mesmo código compilado por JIT, o que reduz a memória exigida pelo aplicativo.If an assembly is loaded domain-neutral, all application domains that share the same security grant set can share the same JIT-compiled code, which reduces the memory required by the application. No entanto, o assembly jamais pode ser descarregado do processo.However, the assembly can never be unloaded from the process.

  • 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.If an assembly is not loaded domain-neutral, it must be JIT-compiled in every application domain in which it is loaded. No entanto, o assembly pode ser descarregado do processo descarregando-se todos os domínios de aplicativo em que ele está carregado.However, the assembly can be unloaded from the process by unloading all the application domains in which it is loaded.

O host de tempo de execução decidirá se é necessário carregar os assemblies como neutros com relação ao domínio quando ele carregar o tempo de execução em um processo.The runtime host determines whether to load assemblies as domain-neutral when it loads the runtime into a process. Para aplicativos gerenciados, aplique o atributo LoaderOptimizationAttribute ao método de ponto de entrada do processo e especifique um valor da enumeração LoaderOptimization associada.For managed applications, apply the LoaderOptimizationAttribute attribute to the entry-point method for the process, and specify a value from the associated LoaderOptimization enumeration. Para aplicativos não gerenciados que hospedam o Common Language Runtime, especifique o sinalizador apropriado ao chamar o método CorBindToRuntimeEx Function.For unmanaged applications that host the common language runtime, specify the appropriate flag when you call the CorBindToRuntimeEx Function method.

Existem três opções para carregar assemblies de domínio neutro:There are three options for loading domain-neutral assemblies:

  • LoaderOptimization.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.LoaderOptimization.SingleDomain loads no assemblies as domain-neutral, except Mscorlib, which is always loaded domain-neutral. Essa configuração é chamada de domínio único, porque ela normalmente é usada quando o host está executando apenas um único aplicativo no processo.This setting is called single domain because it is commonly used when the host is running only a single application in the process.

  • LoaderOptimization.MultiDomain carrega todos os assemblies como neutros em relação ao domínio.LoaderOptimization.MultiDomain loads all assemblies as domain-neutral. Use essa configuração quando houver vários domínios de aplicativo no processo, todos executando o mesmo código.Use this setting when there are multiple application domains in the process, all of which run the same code.

  • LoaderOptimization.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 de assembly global.LoaderOptimization.MultiDomainHost loads strong-named assemblies as domain-neutral, if they and all their dependencies have been installed in the global assembly cache. Outros assemblies são carregados e compilados por JIT separadamente para cada domínio de aplicativo em que são carregados e, assim, podem ser descarregados do processo.Other assemblies are loaded and JIT-compiled separately for each application domain in which they are loaded, and thus can be unloaded from the process. Use essa configuração ao executar mais de um aplicativo no mesmo processo, ou se você tiver uma combinação de assemblies compartilhados por vários domínios de aplicativos e assemblies que precisam ser descarregados do processo.Use this setting when running more than one application in the same process, or if you have a mixture of assemblies that are shared by many application domains and assemblies that need to be unloaded from the process.

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 com base em imagens usando sobrecargas do método Load que especificam matrizes de bytes.JIT-compiled code cannot be shared for assemblies loaded into the load-from context, using the LoadFrom method of the Assembly class, or loaded from images using overloads of the Load method that specify byte arrays.

Os assemblies que foram compilados para código nativo usando o Ngen.exe (Gerador de Imagem Nativa) poderão ser compartilhados entre domínios de aplicativo, se eles tiverem sido carregados como neutros em relação ao domínio na primeira vez em que eles forem carregados em um processo.Assemblies that have been compiled to native code by using the Ngen.exe (Native Image Generator) can be shared between application domains, if they are loaded domain-neutral the first time they are loaded into a process.

Códigos compilados por JIT para o assembly que contém o ponto de entrada do aplicativo só serão compartilhados se todas as suas dependências puderem ser compartilhadas.JIT-compiled code for the assembly that contains the application entry point is shared only if all its dependencies can be shared.

Um assembly neutro em relação ao domínio pode ser compilado por JIT mais de uma vez.A domain-neutral assembly can be JIT-compiled more than once. Por exemplo, quando os conjuntos de concessões de segurança de dois domínios de aplicativo forem diferentes, eles não poderão compartilhar o mesmo código compilado por JIT.For example, when the security grant sets of two application domains are different, they cannot share the same JIT-compiled code. No entanto, cada cópia do assembly compilado por JIT pode ser compartilhada com outros domínios de aplicativo que tenham o mesmo conjunto de concessões.However, each copy of the JIT-compiled assembly can be shared with other application domains that have the same grant set.

Ao decidir se 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.When you decide whether to load assemblies as domain-neutral, you must make a tradeoff between reducing memory use and other performance factors.

  • O acesso a dados e métodos estáticos é mais lento para assemblies neutros em relação ao domínio devido à necessidade de isolamento dos assemblies.Access to static data and methods is slower for domain-neutral assemblies because of the need to isolate 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.Each application domain that accesses the assembly must have a separate copy of the static data, to prevent references to objects in static fields from crossing domain boundaries. Como resultado, o tempo de execução contém a lógica adicional para direcionar um chamador para a cópia apropriada de dados estáticos ou método.As a result, the runtime contains additional logic to direct a caller to the appropriate copy of the static data or method. Essa lógica extra retarda a chamada.This extra logic slows down the call.

  • Todas as dependências de um assembly deverão estar localizadas e carregadas quando o assembly for 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 impedirá que o assembly seja carregado como neutro em relação ao domínio.All the dependencies of an assembly must be located and loaded when the assembly is loaded domain-neutral, because a dependency that cannot be loaded domain-neutral prevents the assembly from being loaded domain-neutral.

Domínios do aplicativo e threadsApplication domains and threads

Um domínio de aplicativo forma um limite de isolamento para segurança, controle de versão, confiabilidade e descarregamento de código gerenciado.An application domain forms an isolation boundary for security, versioning, reliability, and unloading of managed code. Um thread é o constructo do sistema operacional usado pelo Common Language Runtime para executar código.A thread is the operating system construct used by the common language runtime to execute code. No tempo de execução, todos os códigos gerenciados são carregados em um domínio de aplicativo e são executados por um ou mais threads gerenciados.At run time, all managed code is loaded into an application domain and is run by one or more managed threads.

Não há uma correlação um-para-um entre domínios de aplicativo e threads.There is not a one-to-one correlation between application domains and threads. Vários threads podem ser executados em um único domínio de aplicativo a qualquer momento e um determinado thread não está confinado a um único domínio de aplicativo.Several threads can execute in a single application domain at any given time, and a particular thread is not confined to a single application domain. Ou seja, threads são livres para atravessar limites de domínio de aplicativo; um novo thread não é criado para cada domínio de aplicativo.That is, threads are free to cross application domain boundaries; a new thread is not created for each application domain.

A qualquer momento, cada thread é executado em um domínio de aplicativo.At any given time, every thread executes in an application domain. Zero, um ou vários threads podem estar em execução em um determinado domínio de aplicativo.Zero, one, or multiple threads might be executing in any given application domain. O tempo de execução acompanha quais threads estão em execução em quais domínios do aplicativo.The runtime keeps track of which threads are running in which application domains. Você pode localizar o domínio no qual um thread está em execução a qualquer momento chamando o método Thread.GetDomain.You can locate the domain in which a thread is executing at any time by calling the Thread.GetDomain method.

Domínios do aplicativo e culturasApplication domains and cultures

A cultura, que é representada por um objeto CultureInfo, está associada a threads.Culture, which is represented by a CultureInfo object, is associated with threads. Você pode obter a cultura associada ao thread em execução no momento usando a propriedade CultureInfo.CurrentCulture e obter ou definir a cultura associada ao thread em execução no momento usando a propriedade Thread.CurrentCulture.You can get the culture that is associated with the currently executing thread by using the CultureInfo.CurrentCulture property, and you can get or set the culture that is associated with the currently executing thread by using the Thread.CurrentCulture property. Se a cultura associada a um thread tiver sido definida explicitamente usando-se a propriedade Thread.CurrentCulture, ela continuará sendo associada a esse thread quando ele cruzar os limites de domínio do aplicativo.If the culture that is associated with a thread has been explicitly set by using the Thread.CurrentCulture property, it continues to be associated with that thread when the thread crosses application domain boundaries. Do contrário, a cultura associada ao thread em um dado momento é determinada pelo valor da propriedade CultureInfo.DefaultThreadCurrentCulture no domínio do aplicativo no qual o thread está sendo executado:Otherwise, the culture that is associated with the thread at any given time is determined by the value of the CultureInfo.DefaultThreadCurrentCulture property in the application domain in which the thread is executing:

  • Se o valor da propriedade não for null, a cultura retornada pela propriedade estará associada ao thread (e, assim, retornada pelas propriedades Thread.CurrentCulture e CultureInfo.CurrentCulture).If the value of the property is not null, the culture that is returned by the property is associated with the thread (and therefore returned by the Thread.CurrentCulture and CultureInfo.CurrentCulture properties).

  • Se o valor da propriedade for null, a cultura do sistema atual estará associada ao thread.If the value of the property is null, the current system culture is associated with the thread.

Programação com domínios do aplicativoProgramming with application domains

Domínios de aplicativo costumam ser criados e manipulados programaticamente por hosts de tempo de execução.Application domains are usually created and manipulated programmatically by runtime hosts. Entretanto, às vezes, um aplicativo também pode preferir trabalhar com domínios de aplicativo.However, sometimes an application program might also want to work with application domains. Por exemplo, um programa de aplicativo pode carregar um componente do aplicativo em um domínio para poder descarregar o domínio (e o componente) sem precisar interromper o aplicativo inteiro.For example, an application program could load an application component into a domain to be able to unload the domain (and the component) without having to stop the entire application.

O AppDomain é a interface programática para domínios de aplicativo.The AppDomain is the programmatic interface to application domains. Essa classe inclui métodos para criar e descarregar domínios, para criar instâncias de tipos em domínios e registrar várias notificações como o descarregamento de domínio do aplicativo.This class includes methods to create and unload domains, to create instances of types in domains, and to register for various notifications such as application domain unloading. A tabela a seguir lista os métodos AppDomain mais usados.The following table lists commonly used AppDomain methods.

Método AppDomainAppDomain Method DescriçãoDescription
CreateDomain Cria um novo domínio de aplicativo.Creates a new application domain. É recomendável usar uma sobrecarga desse método que especifique um objeto AppDomainSetup.It is recommended that you use an overload of this method that specifies an AppDomainSetup object. Essa é a maneira preferencial para definir as propriedades de um novo domínio, como a base do aplicativo ou o diretório raiz do aplicativo; o local do arquivo de configuração do domínio e o caminho de pesquisa que o Common Language Runtime deve usar para carregar assemblies dentro do domínio.This is the preferred way to set the properties of a new domain, such as the application base, or root directory for the application; the location of the configuration file for the domain; and the search path that the common language runtime is to use to load assemblies into the domain.
ExecuteAssembly e ExecuteAssemblyByNameExecuteAssembly and ExecuteAssemblyByName Executa um assembly no domínio do aplicativo.Executes an assembly in the application domain. Como esse é um método de instância, ele pode ser usado para executar código em outro domínio de aplicativo para o qual você tenha uma referência.This is an instance method, so it can be used to execute code in another application domain to which you have a reference.
CreateInstanceAndUnwrap Cria uma instância de um tipo especificado no domínio de aplicativo e retorna um proxy.Creates an instance of a specified type in the application domain, and returns a proxy. Use esse método para evitar carregar o assembly contendo o tipo criado no assembly da chamada.Use this method to avoid loading the assembly containing the created type into the calling assembly.
Unload Executa um desligamento elegante do domínio.Performs a graceful shutdown of the domain. O domínio do aplicativo não é descarregado até que todos os threads em execução no domínio tenham sido interrompidos ou não estejam mais no domínio.The application domain is not unloaded until all threads running in the domain have either stopped or are no longer in the domain.

Observação

Como o Common Language Runtime não dá suporte à serialização de métodos globais, representantes não podem ser usados para executar métodos globais em outros domínios de aplicativo.The common language runtime does not support serialization of global methods, so delegates cannot be used to execute global methods in other application domains.

As interfaces não gerenciadas descritas na Especificação Hospedando Interfaces do Common Language Runtime também dão acesso a domínios de aplicativo.The unmanaged interfaces described in the common language runtime Hosting Interfaces Specification also provide access to application domains. Hosts em tempo de execução podem usar interfaces do código não gerenciado para criar e obter acesso aos domínios de aplicativo dentro de um processo.Runtime hosts can use interfaces from unmanaged code to create and gain access to the application domains within a process.

A variável de ambiente COMPLUS_LoaderOptimizationThe COMPLUS_LoaderOptimization environment variable

Uma variável de ambiente que define a política padrão de otimização do carregador de um aplicativo executável.An environment variable that sets the default loader optimization policy of an executable application.

SintaxeSyntax

COMPLUS_LoaderOptimization = 1  

ComentáriosRemarks

Um aplicativo típico carrega vários assemblies em um domínio de aplicativo antes que o código que eles contêm possa ser executado.A typical application loads several assemblies into an application domain before the code they contain can be executed.

A maneira que o assembly é carregado determina se o seu código compilado por JIT (just-in-time) pode ser compartilhado por vários domínios de aplicativo no processo.The way the assembly is loaded determines whether its just-in-time (JIT) compiled code can be shared by multiple application domains in the process.

  • Se um assembly for carregado em domínio neutro, todos os domínios de aplicativo que compartilhem o mesmo conjunto de concessão de segurança poderão compartilhar o mesmo código compilado por JIT.If an assembly is loaded domain-neutral, all application domains that share the same security grant set can share the same JIT-compiled code. Isso reduz a memória exigida pelo aplicativo.This reduces the memory required by the application.

  • Se um assembly não for carregado em domínio neutro, ele deverá ser compilado por JIT em cada domínio de aplicativo em que for carregado e o carregador não deverá compartilhar recursos internos entre domínios de aplicativo.If an assembly is not loaded domain-neutral, it must be JIT-compiled in every application domain in which it is loaded and the loader must not share internal resources across application domains.

Quando definido como 1, o sinalizador de ambiente COMPLUS_LoaderOptimization força o host do tempo de execução a carregar todos os assemblies de maneira de domínio não neutro, conhecido como SingleDomain.When set to 1, the COMPLUS_LoaderOptimization environment flag forces the runtime host to load all assemblies in non-domain-neutral way known as SingleDomain. 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.SingleDomain loads no assemblies as domain-neutral, except Mscorlib, which is always loaded domain-neutral. Essa configuração é chamada de domínio único, porque ela normalmente é usada quando o host está executando apenas um único aplicativo no processo.This setting is called single domain because it is commonly used when the host is running only a single application in the process.

Cuidado

O sinalizador de ambiente COMPLUS_LoaderOptimization foi projetado para ser usado em cenários de diagnóstico e de teste.The COMPLUS_LoaderOptimization environment flag was designed to be used in diagnostic and test scenarios. Ter o sinalizador ativado pode causar uma grave lentidão e aumentar o uso de memória.Having the flag turned on can cause severe slow-down and increase in memory usage.

Exemplo de códigoCode example

Para forçar todos os assemblies a não serem carregados como domínios neutros para o serviço IISADMIN, pode ser obtido acrescentando COMPLUS_LoaderOptimization=1 ao valor de várias cadeia de caracteres de ambiente na chave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN.To force all assemblies not to be loaded as domain-neutral for the IISADMIN service can be achieved by appending COMPLUS_LoaderOptimization=1 to the Environment’s Multi-String Value in the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN key.

Key = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN  
Name = Environment  
Type = REG_MULTI_SZ  
Value (to append) = COMPLUS_LoaderOptimization=1  

Consulte tambémSee also