Разработка компиляторов

       

Генерация MSIL с использованием Reflection.Emit


Практически для каждой сущности в MSIL, которая может быть получена с помощью механизма рефлексии, в Reflection.Emit существует специальный класс с суффиксом Builder, который может быть использован для генерации этой сущности (например, AssemblyBuilder или TypeBuilder). Отметим, что соглашение об образовании имен не всегда строгое - например, классу FieldInfo соответствует FieldBuilder, а не FieldInfoBuilder, как можно было бы подумать.

Классы с суффиксом Builder предназначены для генерации описываемых сущностей. В каждом таком классе есть методы, позволяющие добавлять поля, методы и прочее содержание, например:

TypeBuilder tb; MethodBuilder mb = tb.DefineMethod("Call"); ILGenerator ilg = mb.GetILGenerator();

Класс ILGenerator, использованный в приведенном примере, уже может генерировать собственно код виртуальной машины путем использования метода Emit и различных дополнительных методов ( DefineLabel, DeclareLocal, BeginScope-EndScope и т.п.).



Содержание раздела