MethodBuilder getMsgMethod = helloWorldClass.DefineMethod(
"GetMsg",
MethodAttributes.Public,
typeof(string),
null);
ILGenerator methodIl = getMsgMethod.GetILGenerator();
methodIl.Emit(OpCodes.Ldarg_0);
methodIl.Emit(OpCodes.Ldfld, msgField);
methodIl.Emit(OpCodes.Ret);
// Создать метод SayHello().
MethodBuilder sayHiMethod = helloWorldClass.DefineMethod(
"SayHello", MethodAttributes.Public, null, null);
methodIl = sayHiMethod.GetILGenerator();
methodIl.EmitWriteLine("Hello from the HelloWorld class!");
methodIl.Emit(OpCodes.Ret);
// Выпустить класс HelloWorld.
helloWorldClass.CreateType();
return builder;
}
Выпуск сборки и набора модулей
Тело метода начинается с установления минимального набора характеристик сборки с применением типов AssemblyName
Version (определенных в пространстве имен System.Reflection). Затем производится получение объекта типа AssemblуBuilder через статический метод AssemblyBuilder.DefineDynamicAssembly().При вызове метода DefineDynamicAssembly()
Следующая задача связана с определением набора модулей (и имени) для новой сборки. Метод DefineDynamicModule()
ModuleBuilder: // Создать новую сборку.
var builder = AssemblyBuilder.DefineDynamicAssembly(
assemblyName,AssemblyBuilderAccess.Run);
Роль типа ModuleBuilder
Тип ModuleBuilder
ModuleBuilder поддерживает несколько членов, которые позволяют определять набор типов, содержащихся внутри модуля (классы, интерфейсы, структуры и т.д.), а также набор встроенных ресурсов (таблицы строк, изображения и т.п.). В табл. 19.10 описаны два метода, относящиеся к созданию. (Обратите внимание, что каждый метод возвращает объект связанного типа, который представляет тип, подлежащий созданию.)Основным членом класса ModuleBuilder
DefineType(). Кроме указания имени типа (в виде простой строки) с помощью перечисления System.Reflection.TypeAttributes можно описывать формат этого типа. В табл. 19.11 приведены избранные члены перечисления TypeAttributes.Выпуск типа HelloClass и строковой переменной-члена
Теперь, когда вы лучше понимаете роль метода ModuleBuilder.CreateType()
HelloWorld и закрытую строковую переменную:// Определить открытый класс по имени HelloWorld.
TypeBuilder helloWorldClass =
module.DefineType("MyAssembly.HelloWorld",
TypeAttributes.Public);
// Определить закрытую переменную-член типа String по имени theMessage.
FieldBuilder msgField = helloWorldClass.DefineField(
"theMessage",
Type.GetType("System.String"),
attributes: FieldAttributes.Private);
Обратите внимание, что метод TypeBuilder.DefineField()
FieldBuilder. В классе TypeBuilder также определены дополнительные методы, которые обеспечивают доступ к другим типам "построителей". Например, метод DefineConstructor() возвращает объект типа ConstructorBuilder, метод DefineProperty() — объект типа PropertyBuilder и т.д.Выпуск конструкторов