Поделиться через


illegalPrepareConstrainedRegion MDA

Обновлен: Ноябрь 2007

Управляемый помощник по отладке (MDA) illegalPrepareConstrainedRegion активируется, если метод RuntimeHelpers.PrepareConstrainedRegions не предшествует непосредственно оператору try обработчика исключений. Данное ограничение находится на уровне MSIL, поэтому допускается использование текста, не создающего код, между вызовом и использованием try, — например, комментариев.

Признаки

Область с ограничением исполнения (CER), которая никогда не обрабатывалась как таковая, но рассматривалась как блок обработки исключений (finally или catch). Как следствие, код в этой области не выполняется в случае недостаточности памяти или прерывания потока.

Причина

Образец подготовки для CER не был должным образом соблюден. Это является ошибкой. Вызов метода PrepareConstrainedRegions, используемого, чтобы помечать обработчики исключений как представляющие CER в своих блоках catch/finally/fault/filter, должен выполняться непосредственно перед оператором try.

Решение

Следует убедиться, что вызов PrepareConstrainedRegions выполняется непосредственно перед оператором try.

Влияние на среду выполнения

Данный помощник по отладке управляемого кода не оказывает влияния на среду CLR.

Результат

MDA отображает имя метода, вызывающего метод PrepareConstrainedRegions, смещение MSIL и сообщение о том, что вызов не предшествовал непосредственно блоку "try".

Конфигурация

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

Пример

В следующем примере кода демонстрируется шаблон, который вызывает активацию MDA:

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

См. также

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке

Общие сведения о маршалинге взаимодействия

Ссылки

MarshalAsAttribute

PrepareConstrainedRegions