Regiões de execução restritaConstrained Execution Regions

Uma CER (região de execução restrita) faz parte de um mecanismo para a criação de código gerenciado confiável.A constrained execution region (CER) is part of a mechanism for authoring reliable managed code. A CER define uma área na qual o CLR (Common Language Runtime) é restrito de gerar exceções fora de banda que possam impedir que o código na área seja executado em sua totalidade.A CER defines an area in which the common language runtime (CLR) is constrained from throwing out-of-band exceptions that would prevent the code in the area from executing in its entirety. Nessa região, o código do usuário é restrito de executar um código que poderá resultar na geração de exceções fora de banda.Within that region, user code is constrained from executing code that would result in the throwing of out-of-band exceptions. O método PrepareConstrainedRegions deve preceder imediatamente um bloco try e marca os blocos catch, finally e fault como regiões de execução restrita.The PrepareConstrainedRegions method must immediately precede a try block and marks catch, finally, and fault blocks as constrained execution regions. Depois de marcado como uma região restrita, o código deverá chamar apenas outro código com contratos de confiabilidade forte e o código não deverá alocar nem fazer chamadas virtuais a métodos não preparados ou não confiáveis, a menos que o código esteja preparado para manipular falhas.Once marked as a constrained region, code must only call other code with strong reliability contracts, and code should not allocate or make virtual calls to unprepared or unreliable methods unless the code is prepared to handle failures. O CLR atrasa as anulações de thread do código que está sendo executado em uma CER.The CLR delays thread aborts for code that is executing in a CER.

Importante

Só há suporte para CER no .NET Framework.CER is only supported in .NET Framework. Este artigo não se aplica ao .NET Core ou ao .NET 5 e posterior.This article doesn't apply to .NET Core or .NET 5 and above.

As regiões de execução restrita são usadas de formas diferentes no CLR, além de um bloco try anotado, especialmente, finalizadores críticos executados em classes derivadas da classe CriticalFinalizerObject e um código executado com o método ExecuteCodeWithGuaranteedCleanup.Constrained execution regions are used in different forms in the CLR in addition to an annotated try block, notably critical finalizers executing in classes derived from the CriticalFinalizerObject class and code executed using the ExecuteCodeWithGuaranteedCleanup method.

Preparação antecipada da CERCER Advance Preparation

O CLR prepara as CERs com antecedência para evitar condições de memória insuficiente.The CLR prepares CERs in advance to avoid out-of-memory conditions. A preparação antecipada é necessária para que a CLR não cause uma condição de memória insuficiente durante a compilação Just-In-Time ou o carregamento de tipo.Advance preparation is required so the CLR does not cause an out of memory condition during just-in-time compilation or type loading.

O desenvolvedor deve indicar que uma região de código é uma CER:The developer is required to indicate that a code region is a CER:

RestriçõesConstraints

Os usuários são restritos no tipo de código que podem gravar em uma CER.Users are constrained in the type of code they can write in a CER. O código não pode causar uma exceção fora de banda, como as que podem ser o resultado das seguintes operações:The code cannot cause an out-of-band exception, such as might result from the following operations:

  • Alocação explícita.Explicit allocation.

  • Conversão boxing.Boxing.

  • Aquisição de um bloqueio.Acquiring a lock.

  • Chamada virtual a métodos não preparados.Calling unprepared methods virtually.

  • Chamada a métodos com um contrato de confiabilidade fraca ou não existente.Calling methods with a weak or nonexistent reliability contract.

No .NET Framework versão 2.0, essas restrições são diretrizes.In the .NET Framework version 2.0, these constraints are guidelines. O diagnóstico é fornecido por meio das ferramentas de análise de código.Diagnostics are provided through code analysis tools.

Contratos de confiabilidadeReliability Contracts

O ReliabilityContractAttribute é um atributo personalizado que documenta as garantias de confiabilidade e o estado de corrupção de determinado método.The ReliabilityContractAttribute is a custom attribute that documents the reliability guarantees and the corruption state of a given method.

Garantias de confiabilidadeReliability Guarantees

As garantias de confiabilidade, representadas pelos valores de enumeração Cer, indicam o grau de confiabilidade de determinado método:Reliability guarantees, represented by Cer enumeration values, indicate the degree of reliability of a given method:

  • MayFail.MayFail. Em condições excepcionais, o método poderá falhar.Under exceptional conditions, the method might fail. Nesse caso, o método relata novamente ao método de chamada se ele teve êxito ou falhou.In this case, the method reports back to the calling method whether it succeeded or failed. O método deve estar contido em uma CER para garantir que ele possa relatar o valor retornado.The method must be contained in a CER to ensure that it can report the return value.

  • None.None. O método, tipo ou assembly não tem nenhum conceito de uma CER e, provavelmente, não é seguro de ser chamado em uma CER sem uma mitigação significativa dos danos ao estado.The method, type, or assembly has no concept of a CER and is most likely not safe to call within a CER without substantial mitigation from state corruption. Ele não aproveita as garantias da CER.It does not take advantage of CER guarantees. Isso significa o seguinte:This implies the following:

    1. Em condições excepcionais, o método poderá falhar.Under exceptional conditions the method might fail.

    2. O método poderá ou não relatar sua falha.The method might or might not report that it failed.

    3. O método não é escrito para usar uma CER, o cenário mais provável.The method is not written to use a CER, the most likely scenario.

    4. Se um método, tipo ou assembly não for identificado explicitamente para ter êxito, ele será identificado implicitamente como None.If a method, type, or assembly is not explicitly identified to succeed, it is implicitly identified as None.

  • Success.Success. Em condições excepcionais, o método tem a garantia de ter êxito.Under exceptional conditions, the method is guaranteed to succeed. Para atingir esse nível de confiabilidade, você sempre deve construir uma CER em torno do método chamado, mesmo quando ele é chamado em uma região fora da CER.To achieve this level of reliability you should always construct a CER around the method that is called, even when it is called from within a non-CER region. Um método é bem-sucedido se cumpre a finalidade para a qual se destina, embora o êxito possa ser visto de forma subjetiva.A method is successful if it accomplishes what is intended, although success can be viewed subjectively. Por exemplo, a marcação de Count com ReliabilityContractAttribute(Cer.Success) significa que quando ele é executado em uma CER, ele sempre retorna uma contagem do número de elementos no ArrayList e ele nunca pode deixar os campos internos em um estado indeterminado.For example, marking Count with ReliabilityContractAttribute(Cer.Success) implies that when it is run under a CER, it always returns a count of the number of elements in the ArrayList and it can never leave the internal fields in an undetermined state. No entanto, o método CompareExchange é marcado como êxito também, com o entendimento de que o êxito pode indicar que o valor não pode ser substituído por um novo valor devido a uma condição de corrida.However, the CompareExchange method is marked as success as well, with the understanding that success may mean the value could not be replaced with a new value due to a race condition. O ponto principal é que o método se comporta da maneira que está documentado para se comportar e o código da CER não precisa ser escrito para esperar qualquer comportamento incomum além do que um código correto, mas não confiável, poderá ter.The key point is that the method behaves in the way it is documented to behave, and CER code does not need to be written to expect any unusual behavior beyond what correct but unreliable code would look like.

Níveis de corrupçãoCorruption levels

Os níveis de corrupção, representados pelos valores de enumeração Consistency, indicam o provável nível de danos ao estado em determinado ambiente:Corruption levels, represented by Consistency enumeration values, indicate how much state may be corrupted in a given environment:

  • MayCorruptAppDomain.MayCorruptAppDomain. Em condições excepcionais, o CLR (Common Language Runtime) não oferece garantias em relação à consistência de estado no domínio do aplicativo atual.Under exceptional conditions, the common language runtime (CLR) makes no guarantees regarding state consistency in the current application domain.

  • MayCorruptInstance.MayCorruptInstance. Em condições excepcionais, o método tem a garantia de limitar os danos ao estado na instância atual.Under exceptional conditions, the method is guaranteed to limit state corruption to the current instance.

  • MayCorruptProcess, em condições excepcionais, o CLR não oferece nenhuma garantia em relação à consistência de estado; ou seja, a condição pode corromper o processo.MayCorruptProcess, Under exceptional conditions, the CLR makes no guarantees regarding state consistency; that is, the condition might corrupt the process.

  • WillNotCorruptState.WillNotCorruptState. Em condições excepcionais, o método tem a garantia de não corromper o estado.Under exceptional conditions, the method is guaranteed not to corrupt state.

Confiabilidade try/catch/finallyReliability try/catch/finally

A confiabilidade try/catch/finally é um mecanismo de tratamento de exceção com o mesmo nível de garantias de previsibilidade da versão não gerenciada.The reliability try/catch/finally is an exception handling mechanism with the same level of predictability guarantees as the unmanaged version. O bloco catch/finally é a CER.The catch/finally block is the CER. Os métodos no bloco exigem preparação antecipada e não devem ser interrompíveis.Methods in the block require advance preparation and must be noninterruptible.

No .NET Framework versão 2.0, o código informa o runtime de que um try é confiável chamando PrepareConstrainedRegions imediatamente antes de um bloco try.In the .NET Framework version 2.0, code informs the runtime that a try is reliable by calling PrepareConstrainedRegions immediately preceding a try block. PrepareConstrainedRegions é membro do RuntimeHelpers, uma classe de suporte do compilador.PrepareConstrainedRegions is a member of RuntimeHelpers, a compiler support class. Chame PrepareConstrainedRegions diretamente, pendente sua disponibilidade por meio dos compiladores.Call PrepareConstrainedRegions directly pending its availability through compilers.

Regiões não interrompíveisNoninterruptible Regions

Uma região não interrompível agrupa um conjunto de instruções em uma CER.A noninterruptible region groups a set of instructions into a CER.

No .NET Framework versão 2.0, pendente disponibilidade por meio do suporte de compilador, o código do usuário cria regiões não interrompíveis com um try/catch/finally confiável que contém um bloco try/catch vazio precedido por uma chamada de método PrepareConstrainedRegions.In .NET Framework version 2.0, pending availability through compiler support, user code creates non-interruptible regions with a reliable try/catch/finally that contains an empty try/catch block preceded by a PrepareConstrainedRegions method call.

Objeto do finalizador críticoCritical Finalizer Object

Um CriticalFinalizerObject garante que a coleta de lixo executará o finalizador.A CriticalFinalizerObject guarantees that garbage collection will execute the finalizer. Após a alocação, o finalizador e seu grafo de chamadas são preparados com antecedência.Upon allocation, the finalizer and its call graph are prepared in advance. O método do finalizador é executado em uma CER e deve respeitar todas as restrições nas CERs e nos finalizadores.The finalizer method executes in a CER, and must obey all the constraints on CERs and finalizers.

Os tipos que herdam SafeHandle e CriticalHandle têm a garantia de que seu finalizador será executado em uma CER.Any types inheriting from SafeHandle and CriticalHandle are guaranteed to have their finalizer execute within a CER. Implemente ReleaseHandle nas classes derivadas SafeHandle para executar qualquer código que deve liberar o identificador.Implement ReleaseHandle in SafeHandle derived classes to execute any code that is required to free the handle.

Código não permitido em CERsCode Not Permitted in CERs

As seguintes operações não são permitidas em CERs:The following operations are not permitted in CERs:

  • Alocações explícitas.Explicit allocations.

  • Aquisição de um bloqueio.Acquiring a lock.

  • Conversão boxing.Boxing.

  • Acesso de matriz multidimensional.Multidimensional array access.

  • Chamadas de método por meio de reflexão.Method calls through reflection.

  • Enter ou Lock.Enter or Lock.

  • Verificações de segurança.Security checks. Não execute demandas, apenas demandas de link.Do not perform demands, only link demands.

  • Isinst e Castclass para objetos COM e proxiesIsinst and Castclass for COM objects and proxies

  • Obtenção ou configuração de campos em um proxy transparente.Getting or setting fields on a transparent proxy.

  • Serialização.Serialization.

  • Ponteiros de função e representantes.Function pointers and delegates.

Veja tambémSee also