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