Выпуск инструкций MSIL для порождаемого отражения
Класс ILGenerator предоставляет методы, которые могут быть использованы для выпуска MSIL. Метод ConstructorBuilder.GetILGenerator возвращает ILGenerator для конструктора. Метод MethodBuilder.GetILGenerator возвращает ILGenerator для метода.
Примечание |
---|
При выполнении динамических методов 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