invalidCERCall MDA
O invalidCERCall Assistente de depuração gerenciada (MDA) é ativado quando há uma chamada dentro do gráfico (CER) da região de execução restrita a um método que possui nenhum contrato de confiabilidade ou contrato excessivamente fraco. Um contrato fraco é um contrato que declara que a pior corrupção de estado do caso é de escopo maior que a instância passada para a chamada, isto é, o AppDomain ou o estado de processo pode ficar corrompido ou que seu resultado é não sempre determinista computáveis quando chamado dentro de uma CER.
Sintomas
Resultados inesperados ao executar o código em uma CER. Os sintomas não são específicos. Pode ser inesperado OutOfMemoryException, um ThreadAbortException, ou outras exceções na chamada para o método não é confiável porque o runtime não prepará-lo com antecedência ou protegê-lo de 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 pode deixar o AppDomain ou processo em um estado instável, que é contrária ao objetivo de uma CER. O motivo de que uma CER é criada é evitar danos de estado como esse. Os sintomas de um estado corrompido são específicos do aplicativo porque a definição de um estado consistente é diferente entre aplicativos.
Causa
O código dentro de uma CER está chamando uma função com não ReliabilityContractAttribute ou com um fraco ReliabilityContractAttribute que não é compatível com a execução em uma CER.
Em termos de sintaxe de contrato de confiabilidade, um contrato fraco é um contrato que não especificam uma Consistency o valor de enumeração ou especifica um Consistency o valor de MayCorruptProcess, MayCorruptAppDomain, ou None. Qualquer uma dessas condições indica que o código de chamada pode prejudicar os esforços do código no CER para manter um estado consistente. As CERs permitem que o código para tratar erros de uma maneira muito determinista, mantendo a constantes internas que são importantes para o aplicativo e permitindo que ele continue em execução na face de erros transitórios, como exceções de memória insuficiente.
A ativação deste MDA indica a possibilidade do método sendo chamado no CER pode falhar de forma que o chamador não esperava ou que deixa a AppDomain ou processar o estado corrompido ou irrecuperável. Obviamente, o código de chamada pode ser executado corretamente e o problema é simplesmente um contrato ausente. No entanto, os problemas envolvidos na escrever código confiável são sutis e ausência de um contrato é um bom indicador, que o código pode não ser executado corretamente. Os contratos são indicadores que o programador foi codificado de forma confiável e também promete que essas garantias não mudarão no futuro revisões do código. Ou seja, os contratos são declarações de intenções e não apenas os detalhes de implementação.
Como qualquer método com um contrato fraco ou inexistente pode potencialmente diversas falhas imprevisíveis, o runtime não tenta remover qualquer uma das suas próprias falhas imprevisíveis do método introduzidas pela lenta compilação JIT, população do dicionário de genéricos, ou anulações de thread, por exemplo. Isto é, quando este MDA é ativado, ele indica que o runtime não incluiu o método chamado na CER que está sendo definido; o gráfico de chamada foi finalizado por este nó porque continua a preparar esta subárvore ajudaria o possível erro de máscara.
Resolução
Adicionar um contrato de confiabilidade válido para a função ou evite usar aquela chamada de função.
Efeito sobre o tempo de execução.
O efeito de uma CER ligando um contrato fraco poderia ser a falha CER para completar suas operações. Isso pode levar à corrupção da AppDomain estado de processo.
Saída
A seguir é 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>
Consulte também
Referência
System.Runtime.ConstrainedExecution