illegalPrepareConstrainedRegion MDA
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
{
…
}
}