MDA illegalPrepareConstrainedRegion
Observação
Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O MDA (Assistente de Depuração Gerenciado) de illegalPrepareConstrainedRegion
é ativado quando uma chamada de método RuntimeHelpers.PrepareConstrainedRegions não precede imediatamente a instrução try
do manipulador de exceção. Essa restrição é em nível de MSIL, portanto, é possível ter uma origem não geradora de código entre a chamada e o try
, assim como comentários.
Sintomas
Uma região de execução restrita (CER) que nunca é tratada como tal, mas como uma bloco de tratamento de exceção simples (finally
ou catch
). Como consequência, a região não é executada no caso de uma condição de falta de memória ou uma anulação de thread.
Causa
O padrão de preparação para uma CER não é seguido corretamente. Isso é um evento de erro. A chamada de método PrepareConstrainedRegions usada para marcar manipuladores de exceção como introduzindo uma CER em seus blocos catch
/finally
/fault
/filter
deve ser usada imediatamente antes da instrução try
.
Resolução
Certifique-se de que a chamada para PrepareConstrainedRegions ocorre imediatamente antes da instrução try
.
Efeito sobre o runtime
Esse MDA não tem efeito sobre o CLR.
Saída
O MDA exibe o nome do método chamando o método PrepareConstrainedRegions, o deslocamento da MSIL e uma mensagem indicando que a chamada não precede imediatamente o início do bloco try.
Configuração
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion/>
</assistants>
</mdaConfig>
Exemplo
O exemplo de código a seguir demonstra o padrão que faz com que esse MDA seja ativado.
void MethodWithInvalidPCR()
{
RuntimeHelpers.PrepareConstrainedRegions();
Object o = new Object();
try
{
…
}
finally
{
…
}
}