Здесь сразу же может возникнуть вопрос: "В чем разница между статическими и динамическими компоновочными блоками?" По определению,
Конечно, создание динамических компоновочных блоков является довольно сложным (и не слишком часто применяемым) приемом программирования, но этот подход может оказаться полезным в следующих обстоятельствах,
• При создании инструментов программирования .NET. позволяющих по требованию динамически генерировать компоновочные блоки в зависимости от пользовательского ввода.
• При создании программ, способных динамически генерировать агенты доступа к удаленным типам на основе получаемых метаданных.
• При загрузке статических компоновочных блоков с динамическим добавлением новых типов в двоичный образ.
Учитывая сказанное, давайте рассмотрим типы, предлагаемые в System.Reflection.Emit.
Исследование пространства имен System.Reflection.Emit
Для создания динамического компоновочного блока требуется в определенной мере понимать коды операций CIL, но типы пространства имен System.Reflection. Emit в максимальной мере "пытаются" скрыть сложность CIL. Например, вместо прямого указания необходимых директив и атрибутов CIL при определении типа класса вы можете просто использовать класс TypeBuilder. Точно так же, чтобы определить новый конструктор уровня экземпляра, нет никакой необходимости использовать specialname, rtspecialname и лексемы .ctor – вместо этого можно просто использовать ConstructorBuilder. Описания ключевых членов пространства имен System.Reflection.Emit приводятся в табл. 15.8.
Таблица 15.8. Избранные члены пространства имен System.Reflection.Emit
| Члены | Описание |
|---|---|
| AssemblyBuilder | Используется для создания компоновочного блока (*.dll или *.exe) в среде выполнения. В случае *.exe следует вызвать метод ModuleBuilder.SetEntryPoint(), чтобы указать метод, являющийся точкой входа в модуль. Если точка входа не указана, будет сгенерирована *.dll |
| ModuleBuilder | Используется для определения множества модулей в рамках данного компоновочного блока |
| EnumBuilder | Используется для создания типа перечня .NET |
| TypeBuilder | Может использоваться дли создания классов, интерфейсов, структур и делегатов в рамках модуля в среде выполнения |
| MethodBuilder EventBuilder LocalBuilder PropertyBuilder FieldBuilder ConstructorBuilder CustomAttributeBuilder ParameterBuilder | Используются для создания членов типа (таких как методы, локальные переменные, свойства, конструкторы и атрибуты) в среде выполнения |
| ILGenerator | Генерирует коды операций CIL в данном члене типа |
| OpCodes | Обеспечивает множество полей, отображающихся в коды операций CIL. Этот тип используется вместе с различными членами System.Reflection.Emit.ILGenerator |