Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
ConstructorBuilder myCtorBuilder = /* */;
ILGenerator myCILGen = myCtorBuilder.GetILGenerator();
Имея объект
ILGenerator
ILGenerator

Основным методом класса
ILGenerator
Emit()
System.Reflection.Emit.Opcodes
Выпуск динамической сборки
Чтобы проиллюстрировать процесс определения сборки .NET Core во время выполнения, давайте рассмотрим процесс создания однофайловой динамической сборки по имени
MyAssembly.dll
Внутри модуля находится класс
HelloWorld
theMessage
string
HelloWorld
SayНеllo()
GetMsg()
<b>// Этот класс будет создаваться во время выполнения с использованием</b>
<b>// пространства имен System.Reflection.Emit.</b>
public class HelloWorld
{
private string theMessage;
HelloWorld() {}
HelloWorld(string s) {theMessage = s;}
public string GetMsg() {return theMessage;}
public void SayHello()
{
System.Console.WriteLine("Hello from the HelloWorld class!");
}
}
Создайте новый проект консольного приложения по имени
MyAsmBuilder
System.Reflection.Emit
System.Reflection
System.Reflection.Emit
Program
CreateMyAsm()
• определение характеристик динамической сборки (имя, версия и т.п.);
• реализация типа
HelloClass
• возвращение вызывающему методу объекта
AssemblyBuilder
Ниже приведен полный код, а затем его анализ:
static AssemblyBuilder CreateMyAsm()
{
<b> // Установить общие характеристики сборки.</b>
AssemblyName assemblyName = new AssemblyName
{
Name = "MyAssembly",
Version = new Version("1.0.0.0")
};
<b> // Создать новую сборку.</b>
var builder = AssemblyBuilder.DefineDynamicAssembly(
assemblyName,AssemblyBuilderAccess.Run);
<b> // Определить имя модуля.</b>
ModuleBuilder module =
builder.DefineDynamicModule("MyAssembly");
<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);
<b> // Создать специальный конструктор.</b>
Type[] constructorArgs = new Type[1];
constructorArgs[0] = typeof(string);
ConstructorBuilder constructor =
helloWorldClass.DefineConstructor(
MethodAttributes.Public,
CallingConventions.Standard,
constructorArgs);
ILGenerator constructorIl = constructor.GetILGenerator();
constructorIl.Emit(OpCodes.Ldarg_0);
Type objectClass = typeof(object);
ConstructorInfo superConstructor =
objectClass.GetConstructor(new Type[0]);
constructorIl.Emit(OpCodes.Call, superConstructor);
constructorIl.Emit(OpCodes.Ldarg_0);
constructorIl.Emit(OpCodes.Ldarg_1);