Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O invalidCERCall assistente de depuração gerido (MDA) é ativado quando há uma chamada dentro do grafo da região de execução restrita (CER) para um método que não tem contrato de fiabilidade ou que é excessivamente fraco. Um contrato fraco é um contrato que declara que o estado de corrupção no pior caso é de maior alcance do que a instância passada para a chamada, ou seja, o AppDomain estado do processo ou pode corromper-se ou que o seu resultado nem sempre é computável deterministicamente quando chamado dentro de uma CER.
Sintomas
Resultados inesperados ao executar código numa CER. Os sintomas não são específicos. Podem ser uma exceção inesperada OutOfMemoryException, a ThreadAbortException, ou outras na chamada para o método não fiável porque o tempo de execução não o preparou previamente nem o protegeu contra ThreadAbortException exceções em tempo de execução. Uma ameaça maior é que qualquer exceção resultante do método em tempo de execução possa deixar o AppDomain processo ou num estado instável, o que é contrário ao objetivo de uma CER. A razão pela qual uma CER é criada é para evitar corrupções estatais como esta. Os sintomas do estado corrompido são específicos da aplicação porque a definição de estado consistente é diferente entre aplicações.
Motivo
O código dentro de um CER chama uma função sem ReliabilityContractAttribute ou com um fraco ReliabilityContractAttribute que não é compatível com execução num CER.
Em termos de sintaxe de contrato de fiabilidade, um contrato fraco é um contrato que não especifica um Consistency valor de enumeração nem especifica um Consistency valor de MayCorruptProcess, MayCorruptAppDomain, ou None. Qualquer uma destas condições indica que o código chamado pode dificultar os esforços do outro código no CER para manter um estado consistente. As CERs permitem que o código trate erros de forma muito determinística, mantendo invariantes internos importantes para a aplicação e permitindo que esta continue a correr perante erros transitórios, como exceções fora de memória.
A ativação deste MDA indica a possibilidade de o método chamado no CER falhar de uma forma que o interlocutor não esperava ou que deixe o AppDomain estado do processo corrompido ou irrecuperável. Claro que o código chamado pode correr corretamente e o problema é simplesmente um contrato em falta. No entanto, as questões envolvidas na escrita de código fiável são subtis e a ausência de contrato é um bom indicador de que o código pode não ser executado corretamente. Os contratos são indicadores de que o programador programou de forma fiável e também promete que essas garantias não mudarão em futuras revisões do código. Ou seja, os contratos são declarações de intenção e não apenas detalhes de implementação.
Como qualquer método com um contrato fraco ou inexistente pode falhar de muitas formas imprevisíveis, o runtime não tenta remover quaisquer falhas imprevisíveis do método que sejam introduzidas por compilação preguiçosa de JIT, população genérica de dicionários ou abortos de threads, por exemplo. Ou seja, quando este MDA é ativado, indica que o tempo de execução não incluiu o método chamado na CER definida; O grafo de chamadas foi terminado neste nó porque continuar a preparar esta subárvore ajudaria a mascarar o possível erro.
Resolução
Adicione um contrato de fiabilidade válido à função ou evite usar essa chamada de função.
Efeito no tempo de execução
O efeito de chamar um contrato fraco a uma CER pode ser a falha da CER em concluir as suas operações. Isto pode levar à corrupção do AppDomain estado de processo.
Resultado
Segue-se um exemplo de saída deste MDA.
Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.
Configuração
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>