Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 357
- Предыдущая
- 357/642
- Следующая
Изменить размер шрифта:
357
ConstructorBuilder myCtorBuilder = /* */;ILGenerator myCILGen = myCtorBuilder.GetILGenerator();Имея объект
ILGeneratorILGenerator
Основным методом класса
ILGeneratorEmit()System.Reflection.Emit.OpcodesВыпуск динамической сборки
Чтобы проиллюстрировать процесс определения сборки .NET Core во время выполнения, давайте рассмотрим процесс создания однофайловой динамической сборки по имени
MyAssembly.dllВнутри модуля находится класс
HelloWorldtheMessagestringHelloWorldSayНе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!"); }}Создайте новый проект консольного приложения по имени
MyAsmBuilderSystem.Reflection.EmitSystem.ReflectionSystem.Reflection.EmitProgramCreateMyAsm()• определение характеристик динамической сборки (имя, версия и т.п.);
• реализация типа
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);
357
- Предыдущая
- 357/642
- Следующая
Перейти на страницу:
