illegalPrepareConstrainedRegion MDA

注释

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

illegalPrepareConstrainedRegion方法调用不紧接异常处理程序的语句之前tryRuntimeHelpers.PrepareConstrainedRegions将激活托管调试助手 (MDA)。 此限制在 MSIL 级别,因此允许在调用和 try注释之间有非代码生成源。

症状

从未被视为此类的受约束执行区域(CER),但作为简单的异常处理块(finallycatch)。 因此,如果内存不足或线程中止,区域不会运行。

原因

CER 的准备模式未正确遵循。 这是一个错误事件。 PrepareConstrainedRegions用于将异常处理程序标记为在其//catchfault/finallyfilter块中引入 CER 的方法调用必须在语句之前try立即使用。

解决方案

确保调用 PrepareConstrainedRegions 在语句之前 try 立即发生。

对运行时的影响

此 MDA 对 CLR 没有影响。

输出

MDA 显示调用 PrepareConstrainedRegions 方法的名称、MSIL 偏移量和一条消息,指示调用不会紧跟 try 块的开头。

配置

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion/>
  </assistants>
</mdaConfig>

Example

下面的代码示例演示了导致激活此 MDA 的模式。

void MethodWithInvalidPCR()
{
    RuntimeHelpers.PrepareConstrainedRegions();
    Object o = new Object();
    try
    {
        …
    }
    finally
    {
        …
    }
}

另见