illegalPrepareConstrainedRegion MDA

Note

This article is specific to .NET Framework. It doesn't apply to newer implementations of .NET, including .NET 6 and later versions.

The illegalPrepareConstrainedRegion managed debugging assistant (MDA) is activated when a RuntimeHelpers.PrepareConstrainedRegions method call does not immediately precede the try statement of the exception handler. This restriction is at the MSIL level, so it is permissible to have non-code-generating source between the call and the try, such as comments.

Symptoms

A constrained execution region (CER) that is never treated as such, but as a simple exception handling block (finally or catch). As a consequence, the region does not run in the event of an out-of-memory condition or a thread abort.

Cause

The preparation pattern for a CER is not followed correctly. This is an error event. The PrepareConstrainedRegions method call used to mark exception handlers as introducing a CER in their catch/finally/fault/filter blocks must be used immediately before the try statement.

Resolution

Ensure that the call to PrepareConstrainedRegions happens immediately before the try statement.

Effect on the Runtime

This MDA has no effect on the CLR.

Output

The MDA displays the name of the method calling the PrepareConstrainedRegions method, the MSIL offset, and a message indicating the call does not immediately precede the beginning of the try block.

Configuration

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

Example

The following code example demonstrates the pattern that causes this MDA to be activated.

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

See also