illegalPrepareConstrainedRegion MDA
當 RuntimeHelpers.PrepareConstrainedRegions 方法呼叫沒有直接位於例外處理常式的 try 陳述式前面時,illegalPrepareConstrainedRegion Managed 偵錯助理 (MDA) 就會啟動。 這項限制屬於 MSIL 層級,因此可以允許在呼叫和 try 之間具有不產生程式碼的來源 (例如註解)。
症狀
一直不將限制的執行區域 (CER) 視為此種執行區域,而是當成簡單的例外處理區塊 (finally 或 catch)。 因此,這個區域不會在記憶體不足狀況或執行緒中止的事件中執行。
原因
未正確地遵循 CER 的準備模式。 這是一個錯誤事件。 在例外處理常式的 catch/finally/fault/filter 區塊中引入 CER 時,用來標記例外處理常式的 PrepareConstrainedRegions 方法呼叫,必須在 try 陳述式之前直接使用。
解決方式
確定對 PrepareConstrainedRegions 的呼叫會直接出現在 try 陳述式之前。
對執行階段的影響
這個 MDA 對 CLR 無效。
Output
這個 MDA 會顯示呼叫 PrepareConstrainedRegions 方法的方法名稱、MSIL 位移 (Offset),以及指示呼叫沒有直接位於 try 區塊開始位置之前的訊息。
組態
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion/>
</assistants>
</mdaConfig>
範例
下列程式碼範例說明會使這個 MDA 啟動的模式。
void MethodWithInvalidPCR()
{
RuntimeHelpers.PrepareConstrainedRegions();
Object o = new Object();
try
{
…
}
finally
{
…
}
}