illegalPrepareConstrainedRegion MDA
注意
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
RuntimeHelpers.PrepareConstrainedRegions 方法调用不立即出现在异常处理程序的 try
语句之前时,会激活 illegalPrepareConstrainedRegion
托管调试助手 (MDA)。 此限制处于 MSIL 级别,因此允许调用和 try
之间存在非代码生成的源,比如注释。
症状
受约束的执行区域 (CER) 从未以这种方式处理,而是作为简单的异常处理块(finally
或 catch
)处理。 因此,如果内存不足或线程中止,此区域不会运行。
原因
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
{
…
}
}