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