illegalPrepareConstrainedRegion MDA

更新 : 2007 年 11 月

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

症状

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

原因

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

解決策

PrepareConstrainedRegions への呼び出しが try ステートメントの直前に行われるようにします。

ランタイムへの影響

この MDA は、CLR に影響ありません。

出力

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

構成

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

使用例

この MDA がアクティブになるパターンのコード例を次に示します。

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

参照

概念

マネージ デバッグ アシスタントによるエラーの診断

相互運用マーシャリングの概要

参照

MarshalAsAttribute

PrepareConstrainedRegions