Izibook.club
Читать онлайн книги!
  • Главная
  • Жанры
  • Авторы
  • ТОП книг
  • ТОП авторов
  • Контакты

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

Часть 347 из 642 Информация о книге

Формально сущность, используемая для хранения набора вычисляемых значений, называется виртуальным стеком выполнения. Вы увидите, что CIL предоставляет несколько кодов операций, которые служат для помещения значения в стек; такой процесс именуется загрузкой. Кроме того, в CIL определены дополнительные коды операций, которые перемещают самое верхнее значение из стека в память (скажем, в локальную переменную), применяя процесс под названием сохранение.

В мире CIL невозможно напрямую получать доступ к элементам данных, включая локально определенные переменные, входные аргументы методов и данные полей типа. Вместо этого элемент данных должен быть явно загружен в стек и затем извлекаться оттуда для использования в более позднее время (запомните упомянутое требование, поскольку оно содействует пониманию того, почему блок кода CIL может выглядеть несколько избыточным).

На заметку! Вспомните, что код CIL не выполняется напрямую, а компилируется по требованию. Во время компиляции кода CIL многие избыточные аспекты реализации оптимизируются. Более того, если для текущего проекта включена оптимизация кода (на вкладке Build (Сборка) окна свойств проекта в Visual Studio), то компилятор будет также удалять разнообразные избыточные детали CIL.

Чтобы понять, каким образом CIL задействует модель обработки на основе стека, создайте простой метод C# по имени

PrintMessage()
, который не принимает аргументов и возвращает
void
. Внутри его реализации будет просто выводиться значение локальной переменной в стандартный выходной поток:

void PrintMessage()

{

  string myMessage = "Hello.";

  Console.WriteLine(myMessage);

}

Если просмотреть код CIL, который получился в результате трансляции метода

PrintMessage()
компилятором С#, то первым делом обнаружится, что в нем определяется ячейка памяти для локальной переменной с помощью директивы
.locals
. Затем локальная строка загружается и сохраняется в этой локальной переменной с применением кодов операций
ldstr
(загрузить строку) и
stloc.0
(сохранить текущее значение в локальной переменной, находящейся в ячейке
0
).

Далее с помощью кода операции

ldloc.0
(загрузить локальный аргумент по индексу
0
) значение (по индексу 0) загружается в память для использования в вызове метода
System.Console.WriteLine()
, представленном кодом операции
call
. Наконец, посредством кода операции
ret
производится возвращение из функции. Ниже показан (прокомментированный) код CIL для метода
PrintMessage()
(ради краткости из листинга были удалены коды операций
nop
):

.method assembly hidebysig static void PrintMessage() cil managed

{

  .maxstack 1

<b>  // Определить локальную переменную типа string (по индексу 0).</b>

  .locals init ([0] string V_0)

<b>  // Загрузить в стек строку со значением &quot;Hello.&quot;</b>

  ldstr &quot; Hello.&quot;

<b>   // Сохранить строковое значение из стека в локальной переменной.</b>

  stloc.0

<b>  // Загрузить значение по индексу 0.</b>

  ldloc.0

<b>  // Вызвать метод с текущим значением.</b>

  call void [System.Console]System.Console::WriteLine(string)

  ret

}

На заметку! Как видите, язык CIL поддерживает синтаксис комментариев в виде двойной косой черты (и вдобавок синтаксис

/*...*/
). Подобно компилятору C# компилятор CIL игнорирует комментарии в коде.

Теперь, когда вы знаете основы директив, атрибутов и кодов операций CIL, давайте приступим к практическому программированию на CIL, начав с рассмотрения темы возвратного проектирования.

Возвратное проектирование

В главе 1 было показано, как применять утилиту

ildasm.exe
для просмотра кода CIL, сгенерированного компилятором С#. Тем не менее, вы можете даже не подозревать, что эта утилита позволяет сбрасывать код CIL, содержащийся внутри загруженной в нее сборки, во внешний файл. Полученный подобным образом код CIL можно редактировать и компилировать заново с помощью компилятора CIL (
ilasm.exe
).

Выражаясь формально, такой прием называется возвратным проектированием и может быть полезен в избранных обстоятельствах, которые перечислены ниже.

• Вам необходимо модифицировать сборку, исходный код которой больше не доступен.

• Вы работаете с далеким от идеала компилятором языка .NET Core, который генерирует неэффективный (или явно некорректный) код CIL, поэтому нужно изменять кодовую базу.

• Вы конструируете библиотеку взаимодействия с СОМ и хотите учесть ряд атрибутов COM IDL, которые были утрачены во время процесса преобразования (такие как COM-атрибут

[helpstring]
).

Чтобы ознакомиться с процессом возвратного проектирования, создайте новый проект консольного приложения .NET Core на языке C# по имени

RoundTrip
посредством интерфейса командной строки .NET Core (CLI):

dotnet new console -lang c# -n RoundTrip -o .\RoundTrip -f net5.0

Модифицируйте операторы верхнего уровня, как показано ниже:

<b>// Простое консольное приложение С#.</b>

Console.WriteLine(&quot;Hello CIL code!&quot;);

Console.ReadLine();

Скомпилируйте программу с применением интерфейса CLI:

dotnet build

На заметку! Вспомните из главы 1, что результатом компиляции всех сборок .NET Core (библиотек классов и консольных приложений) будут файлы с расширением

*.dll
, которые выполняются с применением интерфейса .NET Core CLI. Нововведением .NET Core 3+ (и последующих версий) является то, что файл
dotnet.exe
копируется в выходной каталог и переименовывается согласно имени сборки. Таким образом, хотя выглядит так, что ваш проект был скомпилирован в
RoundTrip.exe
, на самом деле он компилируется в
RoundTrip.dll
, а файл
dotnet.exe
копируется в
RoundTrip.exe
вместе с обязательными аргументами командной строки, необходимыми для запуска
Roundtrip.dll
.

Перейти к странице:
Предыдущая страница
Следующая страница
Жанры
  • Военное дело 4
    • Спецслужбы 4
  • Деловая литература 203
    • Банковское дело 3
    • Деловая литература 2
    • Корпоративная культура 13
    • Личные финансы 21
    • Малый бизнес 2
    • Маркетинг, PR, реклама 45
    • О бизнесе популярно 112
    • Отраслевые издания 2
    • Управление, подбор персонала 17
    • Ценные бумаги, инвестиции 3
    • Экономика 28
  • Детективы и триллеры 2756
    • Боевики 313
    • Дамский детективный роман 21
    • Детективы 424
    • Иронические детективы 181
    • Исторические детективы 414
    • Классические детективы 221
    • Криминальные детективы 155
    • Крутой детектив 118
    • Маньяки 15
    • Медицинский триллер 2
    • Политические детективы 44
    • Полицейские детективы 234
    • Прочие Детективы 815
    • Техно триллер 3
    • Триллеры 1197
    • Шпионские детективы 101
  • Детские 495
    • Детская образовательная литература 13
    • Детская проза 164
    • Детские остросюжетные 53
    • Детские приключения 262
    • Детские стихи 21
    • Детский фольклор 1
    • Книга-игра 1
    • Прочая детская литература 77
  • Детские книги 530
    • Детская фантастика 196
    • Детские детективы 3
    • Книги для подростков 23
    • Сказки 264
  • Документальная литература 809
    • Биографии и мемуары 531
    • Военная документалистика 7
    • Искусство и Дизайн 14
    • Критика 11
    • Научпоп 9
    • Прочая документальная литература 73
    • Публицистика 257
  • Дом и Семья 215
    • Домашние животные 14
    • Здоровье и красота 34
    • Кулинария 33
    • Прочее домоводство 8
    • Развлечения 3
    • Сад и Огород 8
    • Сделай сам 2
    • Спорт 10
    • Хобби и ремесла 7
    • Эротика и секс 110
  • Драматургия 109
    • Драма 106
    • Киносценарии 3
    • Мистерия 1
    • Трагедия 1
  • Жанр не определен 8
    • Разное 8
  • Компьютеры и Интернет 15
    • Базы данных 3
    • Интернет 3
    • Программирование 1
    • Программное обеспечение 1
    • Прочая компьютерная литература 10
  • Любовные романы 26591
    • Исторические любовные романы 955
    • Короткие любовные романы 2676
    • Любовно-фантастические романы 11044
    • Остросюжетные любовные романы 984
    • Порно 90
    • Прочие любовные романы 57
    • Слеш 416
    • Современные любовные романы 10981
    • Фемслеш 44
    • Эротика 6552
  • Научно-образовательная 374
    • Альтернативная медицина 5
    • Астрономия и Космос 7
    • Биология 32
    • Биофизика 2
    • Биохимия 2
    • Ботаника 3
    • Военная история 4
    • Геология и география 3
    • Государство и право 1
    • Детская психология 16
    • Зоология 3
    • Иностранные языки 2
    • Культурология 46
    • Литературоведение 20
    • Медицина 35
    • Обществознание 7
    • Педагогика 20
    • Политика 22
    • Прочая научная литература 58
    • Психотерапия и консультирование 51
    • Религиоведение 7
    • Секс и семейная психология 30
    • Технические науки 4
    • Физика 9
    • Философия 34
    • Химия 3
    • Экология 3
    • Юриспруденция 9
    • Языкознание 18
  • Образование 523
    • Бизнес 45
    • Биография и мемуары 46
    • Здоровье 10
    • История 297
    • Карьера 4
    • Психология 230
  • Поэзия и драматургия 42
    • Басни 2
    • Драматургия 11
    • Лирика 2
    • Поэзия 30
  • Приключения 761
    • Вестерны 14
    • Исторические приключения 419
    • Морские приключения 78
    • Природа и животные 31
    • Прочие приключения 212
    • Путешествия и география 52
  • Проза 2414
    • Антисоветская литература 5
    • Афоризмы 1
    • Военная проза 111
    • Историческая проза 321
    • Классическая проза 132
    • Контркультура 13
    • Магический реализм 92
    • Новелла 14
    • Повесть 24
    • Проза прочее 21
    • Рассказ 73
    • Роман 103
    • Русская классическая проза 73
    • Семейный роман/Семейная сага 3
    • Сентиментальная проза 10
    • Советская классическая проза 47
    • Современная проза 1859
    • Эпистолярная проза 2
    • Эпопея 5
    • Эссе, очерк, этюд, набросок 3
  • Прочее 1519
    • Газеты и журналы 5
    • Изобразительное искусство, фотография 12
    • Кино 13
    • Музыка 11
    • Подростковая литература 6
    • Театр 5
    • Фанфик 1472
  • Религия и духовность 364
    • Астрология 1
    • Буддизм 4
    • Православие 1
    • Прочая религиозная литература 4
    • Религия 24
    • Самосовершенствование 138
    • Хиромантия 1
    • Эзотерика 212
    • Язычество 1
  • Справочная литература 42
    • Прочая справочная литература 3
    • Путеводители 10
    • Руководства 12
    • Справочники 15
    • Энциклопедии 9
  • Старинная литература 153
    • Античная литература 1
    • Древневосточная литература 5
    • Мифы. Легенды. Эпос 34
    • Прочая старинная литература 114
  • Техника 2
    • Автомобили и ПДД 1
    • Архитектура 1
  • Фантастика и фентези 28631
    • Альтернативная история 4193
    • Боевая фантастика 5381
    • Героическая фантастика 1487
    • Городское фэнтези 2291
    • Готический роман 13
    • Детективная фантастика 751
    • Ироническая фантастика 102
    • Ироническое фэнтези 83
    • Историческое фэнтези 531
    • Киберпанк 318
    • Космическая фантастика 1815
    • Космоопера 56
    • ЛитРПГ 1331
    • Любовная фантастика 186
    • Любовное фэнтези 115
    • Мистика 520
    • Научная фантастика 929
    • Попаданцы 9506
    • Постапокалипсис 917
    • Сказочная фантастика 26
    • Социально-философская фантастика 544
    • Стимпанк 151
    • Технофэнтези 143
    • Ужасы 103
    • Ужасы и мистика 825
    • Фантастика 254
    • Фантастика: прочее 231
    • Фэнтези 11570
    • Эпическая фантастика 235
    • Юмористическая фантастика 1075
    • Юмористическое фэнтези 1678
  • Фольклор 7
    • Загадки 1
    • Народные сказки 5
    • Фольклор: прочее 2
  • Юмор 194
    • Анекдоты 1
    • Комедии 1
    • Прочий юмор 67
    • Сатира 3
    • Юмористическая проза 123
    • Юмористические стихи 5
Izibook.club

Бесплатная онлайн библиотека для чтения книг без регистрации с телефона или компьютера. У нас собраны последние новинки, мировые бестселлеры книжного мира.

Контакты
  • pereezdsayta@yandex.ru
Информация
  • Карта сайта
© izibook.club, 2026. | Вход
Этот сайт использует cookie для хранения данных. Продолжая пользоваться сайтом, вы даете свое согласие на работу с этими данными в соответствии с нашей политикой конфиденциальности.
Я согласен