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


Выпуск инструкций MSIL для порождения отражения

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

Класс ILGenerator предоставляет методы, которые могут быть использованы для выпуска MSIL. Метод ConstructorBuilder.GetILGenerator возвращает ILGenerator для конструктора. Метод MethodBuilder.GetILGenerator возвращает ILGenerator для метода.

h0x241a0.alert_note(ru-ru,VS.90).gifПримечание.

При выполнении динамических методов JIT-компилятор вызывается для преобразования MSIL в машинный код. На этом этапе могут быть созданы исключения. Например, исключение InvalidProgramException может быть создано, если основная часть метода превышает внутреннее ограничение, такое как максимально разрешенный размер. Исключение TargetInvocationException может быть создано вместе со внутренним исключением VerificationException, если запрещена SkipVerification в целях принудительной проверки выпущенного MSIL. Рекомендуется запретить SkipVerification во время разработки, так как проверка кода улучшает стабильность и качество программы.

Класс ILGenerator предоставляет следующие службы.

  • Выпуск различных типов инструкций с использованием различных форм методов ILGenerator.Emit. Эти инструкции получают различные типы операндов в зависимости от типа инструкции.

  • Объявление метки. Размещение метки в потоке инструкций задается с помощью другого метода.

  • Разметка положения в потоке MSIL с помощью метки.

  • Создание исключения.

  • Вывод строки в консоль.

  • Определение блока исключения.

    • ILGenerator.BeginExceptionBlock начинает блок исключения.

    • ILGenerator.BeginExceptFilterBlock начинает отфильтрованный обработчик исключения.

    • ILGenerator.BeginCatchBlock начинает типизированный обработчик исключения.

    • ILGenerator.BeginFinallyBlock начинает заключительный обработчик.

    • ILGenerator.BeginFaultBlock начинает обработчик отказа.

    • ILGenerator.EndExceptionBlock завершает блок исключения.

Для обработчиков перехвата последовательность вызовов должна напоминать следующий шаблон.

Emit some MSIL.
BeginExceptionBlock
Emit the MSIL for the try block.
BeginCatchBlock
Emit the MSIL for the handler.
BeginCatchBlock
Emit the MSIL for the handler.
BeginFaultBlock
Emit the MSIL for the fault block.
BeginFinallyBlock
Emit the MSIL for the finally block.
EndExceptionBlock

Для отфильтрованных обработчиков перехвата последовательность вызовов должна напоминать следующий шаблон.

Emit some MSIL.
BeginExceptionBlock
Emit the MSIL for the try block.
BeginExceptFilterBlock
Emit the MSIL for the filtered exception handler.
BeginCatchBlock
Emit the MSIL for the catch block. The catch handler should be supplied with a null type.
BeginFaultBlock
Emit the MSIL for the fault block.
BeginFinallyBlock
Emit the MSIL for the finally block.
EndExceptionBlock

См. также

Другие ресурсы

Использование порожденного отражения