次の方法で共有


illegalPrepareConstrainedRegion MDA

Note

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

illegalPrepareConstrainedRegion マネージド デバッグ アシスタント (MDA) は、RuntimeHelpers.PrepareConstrainedRegions メソッドの呼び出しが、例外ハンドラーの try ステートメントの直前にない場合にアクティブ化されます。 この制限は、MSIL レベルであり、呼び出しと try の間でコメントなどのコードを生成しないソースの使用が許可されます。

現象

そのように扱われず、単純な例外処理ブロック (finally または catch) として扱われる制約された実行領域 (CER)。 その結果、メモリ不足の状態やスレッドの中止のときには領域は実行されません。

原因

CER の準備パターンが正しく実行されません。 エラー イベントが発生します。 catch/finally/fault/filter ブロックで CER の導入として例外ハンドラーをマークするために使用される PrepareConstrainedRegions メソッドの呼び出しを try ステートメントの直前に使用する必要があります。

解決方法

tryステートメントの直前に PrepareConstrainedRegions の呼び出しがあることを確認します。

ランタイムへの影響

この MDA は CLR に影響しません。

出力

MDA は、PrepareConstrainedRegions メソッドの呼び出し元の名前、MSIL のオフセット、および呼び出しが try ブロックの先頭の直前にないことを示すメッセージを表示します。

構成

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

次のコード例では、この MDA のアクティブ化の原因となるパターンを示します。

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

関連項目