illegalPrepareConstrainedRegion MDA
如果异常处理程序的 try 语句没有紧随在 RuntimeHelpers.PrepareConstrainedRegions 方法调用之后,则将激活 illegalPrepareConstrainedRegion 托管调试助手 (MDA)。 此限制处于 MSIL 级别,因此在该调用和 try 之间允许存在非代码生成源,例如注释。
症状
受约束的执行区域 (CER) 从来不被名符其实地视为受约束的执行区域,而是被视为一个简单的异常处理块(finally 或 catch)。 结果,在内存不足或线程中止时不会运行该区域。
原因
没有正确遵循 CER 的准备模式。 这是一个错误事件。 try 语句必须紧随在向 catch/finally/fault/filter 块中引入 CER 时用于标记异常处理程序的 PrepareConstrainedRegions 方法之后。
解决方法
确保紧接在 try语句之前调用 PrepareConstrainedRegions。
对运行时的影响
此 MDA 对 CLR 无任何影响。
Output
此 MDA 显示调用 PrepareConstrainedRegions 方法的方法的名称、MSIL 偏移量和一条指示 try 块没有紧随在该调用之后的消息。
配置
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion/>
</assistants>
</mdaConfig>
示例
下面的代码示例演示了导致激活此 MDA 的模式。
void MethodWithInvalidPCR()
{
RuntimeHelpers.PrepareConstrainedRegions();
Object o = new Object();
try
{
…
}
finally
{
…
}
}