illegalPrepareConstrainedRegion MDA

注意

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

RuntimeHelpers.PrepareConstrainedRegions 方法调用不立即出现在异常处理程序的 try 语句之前时,会激活 illegalPrepareConstrainedRegion 托管调试助手 (MDA)。 此限制处于 MSIL 级别,因此允许调用和 try 之间存在非代码生成的源,比如注释。

症状

受约束的执行区域 (CER) 从未以这种方式处理,而是作为简单的异常处理块(finallycatch)处理。 因此,如果内存不足或线程中止,此区域不会运行。

原因

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

解决方法

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

对运行时的影响

此 MDA 对 CLR 无任何影响。

输出

MDA 显示调用 PrepareConstrainedRegions 方法的方法名称、MSIL 偏移,以及指示调用不会立即出现在 try 块开头的消息。

Configuration

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

示例

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

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

请参阅