Nice-books.net
» » » » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Тут можно читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте Nice-Books.Ru (NiceBooks) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

<b>// Создать специальный конструктор, принимающий</b>

<b>// единственный аргумент типа string.</b>

Type[] constructorArgs = new Type[1];

constructorArgs[0] = typeof(string);

ConstructorBuilder constructor =

  helloWorldClass.DefineConstructor(

    MethodAttributes.Public,

    CallingConventions.Standard,

    constructorArgs);

<b>// Выпустить необходимый код CIL для конструктора.</b>

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);

<b>// Загрузить в стек указатель this объекта.</b>

constructorIl.Emit(OpCodes.Ldarg_0);

constructorIl.Emit(OpCodes.Ldarg_1);

<b>// Загрузить входной аргумент в виртуальный стек и сохранить его в msgField</b>

constructorIl.Emit(OpCodes.Stfld, msgField);

constructorIl.Emit(OpCodes.Ret);

Как вам теперь уже известно, в результате определения специального конструктора для типа стандартный конструктор молча удаляется. Чтобы снова определить конструктор без аргументов, нужно просто вызвать метод DefineDefaultConstructor() типа TypeBuilder:

<b>// Создать стандартный конструктор.</b>

helloWorldClass.DefineDefaultConstructor(

  MethodAttributes.Public);

Выпуск метода SayHello()

В заключение давайте исследуем процесс выпуска метода SayHello(). Первая задача связана с получением объекта типа MethodBuilder из переменной helloWorldClass. После этого можно определить сам метод и получить внутренний объект типа ILGenerator для вставки необходимых инструкций CIL:

<b>// Создать метод SayHello.</b>

MethodBuilder sayHiMethod = helloWorldClass.DefineMethod(

  &quot;SayHello&quot;, MethodAttributes.Public, null, null);

methodIl = sayHiMethod.GetILGenerator();

<b>// Вывести строку на консоль.</b>

methodIl.EmitWriteLine(&quot;Hello from the HelloWorld class!&quot;);

methodIl.Emit(OpCodes.Ret);

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Здесь был определен открытый метод (т.к. указано значение MethodAttributes.Public), который не имеет параметров и ничего не возвращает (на что указывают значения null в вызове DefineMethod()). Также обратите внимание на вызов EmitWriteLine(). Посредством данного вспомогательного метода класса ILGenerator можно записать строку в стандартный поток вывода, приложив минимальные усилия.

Использование динамически сгенерированной сборки

Теперь, когда у вас есть логика для создания сборки, осталось лишь выполнить сгенерированный код. Логика в вызывающем коде обращается к методу CreateMyAsm(), получая ссылку на созданный объект AssemblyBuilder.

Далее вы поупражняетесь с поздним связыванием (см. главу 17) для создания экземпляра класса HelloWorld и взаимодействия с его членами. Модифицируйте операторы верхнего уровня, как показано ниже:

using System;

using System.Reflection;

using System.Reflection.Emit;

Console.WriteLine(&quot;***** The Amazing Dynamic Assembly Builder App *****&quot;);

// Создать объект AssemblyBuilder с использованием вспомогательной функции.

AssemblyBuilder builder = CreateMyAsm();

// Получить тип HelloWorld.

Type hello = builder.GetType(&quot;MyAssembly.HelloWorld&quot;);

// Создать экземпляр HelloWorld и вызвать корректный конструктор.

Console.Write(&quot;-&gt; Enter message to pass HelloWorld class: &quot;);

string msg = Console.ReadLine();

object[] ctorArgs = new object[1];

ctorArgs[0] = msg;

object obj = Activator.CreateInstance(hello, ctorArgs);

// Вызвать метод SayHelloO и отобразить возвращенную строку.

Console.WriteLine(&quot;-&gt; Calling SayHello() via late binding.&quot;);

MethodInfo mi = hello.GetMethod(&quot;SayHello&quot;);

mi.Invoke(obj, null);

// Вызвать метод GetMsg().

mi = hello.GetMethod(&quot;GetMsg&quot;);

Console.WriteLine(mi.Invoke(obj, null));

Фактически только что была построена сборка .NET Core, которая способна создавать и запускать другие сборки .NET Core во время выполнения. На этом исследование языка CIL и роли динамических сборок завершено. Настоящая глава должна была помочь углубить знания системы типов .NET Core, синтаксиса и семантики языка CIL, а также способа обработки кода компилятором C# в процессе его компиляции.

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки Nice-Books.Ru.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор Nice-Books.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*