Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
constructorIl.Emit(OpCodes.Stfld, msgField);
constructorIl.Emit(OpCodes.Ret);
<b> // Создать стандартный конструктор.</b>
helloWorldClass.DefineDefaultConstructor(
MethodAttributes.Public);
<b> // Создать метод GetMsg().</b>
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);
<b> // Создать метод SayHello().</b>
MethodBuilder sayHiMethod = helloWorldClass.DefineMethod(
"SayHello", MethodAttributes.Public, null, null);
methodIl = sayHiMethod.GetILGenerator();
methodIl.EmitWriteLine("Hello from the HelloWorld class!");
methodIl.Emit(OpCodes.Ret);
<b> // Выпустить класс HelloWorld.</b>
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

Основным членом класса
ModuleBuilder
DefineType()
System.Reflection.TypeAttributes
TypeAttributes

Выпуск типа HelloClass и строковой переменной-члена
Теперь, когда вы лучше понимаете роль метода
ModuleBuilder.CreateType()
HelloWorld
<b>// Определить открытый класс по имени HelloWorld.</b>
TypeBuilder helloWorldClass =
module.DefineType("MyAssembly.HelloWorld",
TypeAttributes.Public);
<b>// Определить закрытую переменную-член типа String по имени theMessage.</b>
FieldBuilder msgField = helloWorldClass.DefineField(
"theMessage",
Type.GetType("System.String"),
attributes: FieldAttributes.Private);
Обратите внимание, что метод
TypeBuilder.DefineField()
FieldBuilder
TypeBuilder
DefineConstructor()
ConstructorBuilder
DefineProperty()
PropertyBuilder
Выпуск конструкторов
Как упоминалось ранее, для определения конструктора текущего типа можно применять метод
TypeBuilder.DefineConstructor()
HelloClass
ILGenerator
GetILGenerator()
ConstructorBuilder
Помещение кода CIL в реализацию членов осуществляется с помощью метода
Emit()
ILGenerator
Emit()
Opcodes
Opcodes.Ret
.Opcodes.Stfid
Opcodes.Call