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
    {
        …
    }
}

请参见

概念

使用托管调试助手诊断错误

Interop 封送处理概述

参考

MarshalAsAttribute

PrepareConstrainedRegions