Clr c что это за программа

Особенности работы CLR в .NET framework

Начиная изучать язык C# и .NEt Framework я ни как не мог понять, как же работает CLR. Я либо находил огромные статьи, которые не осилить за 1 вечер либо слишком краткое, скорее даже запутывающее описание процесса (как в книге Г. Шилдта).
Некоторое время назад я решил, что было бы неплохо собирать знания, полученные из книг, «фичи» и часто используемые приемы в одном месте. А то новая информация быстро оседает в голове, но также быстро забывается и спустя несколько недель приходится вновь рыться в сотнях и тысячах строк текста, чтобы найти ответ на вопрос.

Читая очередную книгу по программированию, я делал краткие пометки самого важного, что мне показалось. Иногда описывал некоторый процесс понятным мне языком с придуманным примером и т.д. Я не претендую на абсолютную правильность излагаемого материала. Это всего лишь мое понимание процесса, с моими примерами и информацией, которую я посчитал ключевой для понимания Проработав некоторый материал, я решил сохранить это для всех тех, кому это может быть полезно. А кто уже знаком — тот просто освежит это в памяти.

Самая ВАЖНАЯ часть .NET

Нужно отметить, что понятие «тип» это некоторое подобие класса в языке C#. Но т.к. .NET поддерживает не только C# но и другие языки, то используется понятие «тип», а не привычный «класс». Также данная статья предполагает, что читатель уже знаком с особенностями .Net и раскрывает особенности специфических вещей и процессов.

В качестве примера приведу текст программы, выводящий на экран возраст объекта:
исходный текст программы, чтобы было понятно:
using System;

namespace ConsoleApplication_Test_Csharp
public class SomeClass
int age;
public int GetAge()
age = 22;
return age;
>
>
public sealed class Program
<
public static void Main()
System. Console .Write( «My age is » );
SomeClass me = new SomeClass();
int myAge;
myAge = me.GetAge();
System. Console .WriteLine(myAge);
Console .ReadLine();
>

>
>

* This source code was highlighted with Source Code Highlighter .

И так приступим:

Что такое CLR?

CLR (Common language runtime) — общеязыковая исполняющая среда. Она обеспечивает интеграцию языков и позволяет объектам благодаря стандартному набору типов и метаданным), созданным на одном языке, быть «равноправными гражданами» кода, написанного на другом.

Другими словами CLR этот тот самый механизм, который позволяет программе выполняться в нужном нам порядке, вызывая функции, управляя данными. И все это для разных языков (c#, VisualBasic, Fortran). Да, CLR действительно управляет процессом выполнения команд (машинного кода, если хотите) и решает, какой кусок кода (функцию) от куда взять и куда подставить прямо в момент работы программы. Процесс компиляции представлен на рисунке:

CLR via C#. Глава 1. Модель выполнения кода в среде CLR

IL (Intermediate Language) — код на специальном языке, напоминающим ассемблер, но написанном для .NET. В него преобразуется код из других языков верхнего уровня (c#, VisualBasic). Вот тогда-то и пропадает зависимость от выбранного языка. Ведь все преобразуется в IL (правда тут есть оговорки соответствия общей языковой спецификации CLS, что не входит в рамки данной статьи)
Вот как он выглядит для функции SomeClass::GetAge()

Компилятор, помимо ассемблера IL создает полные метаданные.

Метаданные — набор из таблиц данных, описывающих то, что определено в модуле. Также есть таблицы, указывающие на что ссылается управляемый модуль (например, импортируемые типы и числа). Они расширяют возможности таких технологий как библиотеки типов и файлы языка описания интерфейсов (IDL). Метаданные всегда связаны с файлом с IL кодом, фактически они встроены в *.exe или *.dll.
Таким образом метаданные это таблицы, в которых есть поля, говорящие о том, что такой-то метод находится в таком-то файле и принадлежит такому-то типу(классу).
Вот как выглядят метаданные для моего примера (таблицы метаданных просто преобразованы в понятный вид с помощью дизассемблера ILdasm.exe. На самом деле это часть *.exe файла программы:

TypeDef — это запись, для каждого типа, определенного в модуле
К примеру TypeDef #1 описывает класс SomeClass и показывает поле Field #1 с именем Field Name: age, метод MethodName: GetAge и конструктор MethodName: .ctor. Запись TypeDef #2 описывает класс Program.

Разобравшись с основными понятиями, давайте посмотрим из чего же состоит тот самый управляемый модуль (или просто наш файл ConsoleApplication_Test_Csharp.exe, который выполняет вывод на экран возраста объекта):

Работа JIT

И так, что же происходит, когда запускается впервые программа?
Сперва происходит анализ заголовка, чтобы узнать какой процесс запустить (32 или 64 разрядный). Затем загружается выбранная версия файла MSCorEE.dll ( C:WindowsSystem32MSCorEE.dll для 32разрядных процессоров)
После чего вызывается метод, расположенный MSCorEE.dll, который и инициализирует CLR, сборки и точку входа функции Main() нашей программы.

static void Main()
System. Console .WriteLine( «Hello » );
System. Console .WriteLine( «Goodbye» );
>

* This source code was highlighted with Source Code Highlighter .

Для выполнения какого-либо метода, например System.Console.WriteLine(«Hello „), IL должен быть преобразован в машинные команды (те самые нули и единицы) Этим занимается Jiter или just-in-time compiler.

Сперва, перед выполнением Main() среда CLR находит все объявленные типы (например тип Console).
Затем определяет методы, объединяя их в записи внутри единой “структуры» (по одному методу определенному в типе Console).
Записи содержат адреса, по которым можно найти реализации методов (т.е. те преобразования, которые выполняет метод).

При первом обращение к функции WriteLine вызывается JiT-compiler.
JiTer ‘у известны вызываемый метод и тип, которым определен этот метод.
JiTer ищет в метаданных соответствующей сборки — реализацию кода метода (код реализации метода WriteLine(string str) ).
Затем, он проверяет и компилирует IL в машинный код (собственные команды), сохраняя его в динамической памяти.
После JIT Compiler возвращается к внутренней «структуре» данных типа (Console) и заменяет адрес вызываемого метода, на адрес блока памяти с исполняемыми процессорными командами.
После этого метод Main() обращается к методу WriteLine(string str) повторно. Т.к. код уже скомпилирован, обращение производится минуя JiT Compiler. Выполнив метод WriteLine(string str) управление возвращается методу Main().

Из описания следует, что «медленно» работает функция только в момент первого вызова, когда JIT переводит IL код в инструкции процессора. Во всех остальных случаях код уже находится в памяти и подставляется как оптимизированный для данного процессора. Однако если будет запущена еще одна программа в другом процессе, то Jiter будет вызван снова для того же метода. Для приложений выполняемых в х86 среде JIT генерируется 32-разрядные инструкции, в х64 или IA64 средах — соответственно 64-разрядные.

Оптимизация кода. Управляемый и неуправляемый код

IL может быть оптимизирован, т.е. из него будут удалены IL — команды NOP (пустая команда). Для этого при компиляции нужно добавить параметры

Читайте также:
Программа 5с в поликлинике что это

Debug версия собирается с параметрами: /optimize -, /debug: full
Release версия собирается с параметрами: /optimize +, /debug: pdbonly

Чем же отличается управляемый код от неуправляемого?

Неуправляемый код компилируется для конкретного процессора и при вызове просто исполняется.

В управляемой среде компиляция производится в 2 этапа:

1) компилятор переводит C# код в IL
2) для исполнения нужно перевести IL код в машинный код процессора, что требует доп. динамической памяти и времени (как раз та самая работа JIT).

Взаимодействие с неуправляемым кодом:

— управляемый код может вызывать направляемую функцию из DLL посредствам P/Invoke (например CreateSemaphore из Kernel32.dll).
— управляемый код может использовать существующий COM-компонент (сервер).
— неуправляемый код может использовать управляемый тип (сервер). Можно реализовать COM — компоненты в управляемой среде и тогда не нужно вести подсчет ссылок интерфейсов.

Параметр /clr позволяет скомпилировать Visual С++ код в управляемые IL методы (кроме когда, содержащего команды с ассемблерными вставками ( __asm ), переменное число аргументов или встроенные процедуры ( __enable, _RetrurAddress )). Если этого сделать не получится, то код скомпилируется в стандартные х86 команды. Данные в случае IL кода не являются управляемыми (метаданные не создаются) и не отслеживаются сборщиком мусора (это касается С++ кода).

Система типов

В дополнение хочу рассказать о системе типов CTS, принятой Microsoft.

CTS (Common Type System) — общая система типов в CLR (тип, по-видимому — это аналог класса C#). Это — стандарт, признанный ECMA который описывает определение типов и их поведение. Также определяет правила наследования, виртуальных методов, времени жизни объектов. После регистрации ECMA стандарт получил название CLI ( Common Language Infrastructure)

— CTS поддерживает только единичное наследование (в отличие от С++)
— Все типы наследуются от System.Object (Object — имя типа, корень все остальных типов, System — пространство имен)

По спецификации CTS любой тип содержит 0 или более членов.

Поле — переменная, часть состояния объекта. Идентифицируются по имени и типу.
Метод — функция, выполняющая действие над объектом. Имеет имя, сигнатуру(число параметров, последовательность, типы параметров, возвр. значение функции) и модификаторы.
Свойство — в реализации выглядит как метод (get/set) а для вызывающей стороны как поле ( = ). Свойства позволяют типу, в котором они реализованы, проверить входные параметры и состояние объекта.
Событие — обеспечивает механизм взаимного уведомления объектов.

Public — метод доступен любому коду из любой сборки
Private — методы вызывается только внутри типа
Family (protected) — метод вызывается производными типами независимо от сборки
Assembly (internal) — метод вызывается любым кодом из той же сборки
Family or Assembly
(protected internal) — метод вызывается производными типами из любой сборки и + любыми типами из той же сборки.

CLS (Common Language Specification) — спецификации выпущенная Майкрософт. Она описывает минимальный набор возможностей, которые должны реализовать производители компиляторов, чтобы их продукты работали в CLR. CLR/CTS поддерживает больше возможностей, определенных CLS. Ассемблер IL поддерживает полный набор функций CLR/CTS. Языки (C#, Visual Basic) поддерживает часть возможностей CLR/CTS (в т.ч. минимум от CLS).
Пример на рисунке

Пример проверки на соответствие CLS

Атрибут [assembly: CLSCompliant(true)] заставляет компилятор обнаруживать любые доступные извне типы, содержащие конструкции, недопустимые в других языках.

  1. using System;
  2. [assembly: CLSCompliant( true )]
  3. namespace SomeLibrary
  4. // возникает предупреждение поскольку тип открытый
  5. public sealed class SomeLibraryType
  6. // тип, возвращаемый функцией не соответсвует CLS
  7. public UInt32 Abc()
  8. // идентификатор abc() отличается от предыдущего, только если
  9. // не выдерживается соответсвие
  10. public void abc()
  11. // ошибки нет, метод закрытый
  12. private UInt32 ABC()
  13. >
  14. >

Первое предупреждение: UInt32 Abc() возвращает целочисленное целое без знака. Visaul Basic, например, не работает с такими значениями.
Второе предупрждение: два открытых метода Abc() и abc() — одиноквые и отличаются лишь регистром букв и возвращаемым типом. VisualBasic не может вызывать оба метода.

Убрав public и оставив только sealed class SomeLibraryType оба предупреждения исчезнут. Так как SomeLibraryType по-умолчанию будет internal и не будет виден извне сборки.

P.S. Статья основана на материалах из книги Дж. Рихтера «CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#»

Источник: habr.com

Обзор среды CLR

.NET предоставляет среду выполнения, называемую средой CLR, которая запускает код и предоставляет службы, упрощающие процесс разработки.

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

Компиляторы и средства могут выводить выходные данные, которые может использовать среда CLR, так как система типов, формат метаданных и среда выполнения (виртуальная система выполнения) определяются общедоступным стандартом, спецификацией среды ОБЩЕЙ языковой инфраструктуры ECMA. Дополнительные сведения см. в разделе Спецификации ECMA для C# и инфраструктуры Common Language Infrastructure (CLI).

Чтобы включить в среде выполнения предоставление служб управляемому коду, языковые компиляторы должны предоставлять метаданные с описанием типов, членов и ссылок в коде. Метаданные хранятся вместе с кодом. Они содержатся в каждом загружаемом переносимом исполняемом (PE) файле среды CLR. Метаданные в среде выполнения используются для поиска и загрузки классов, размещения экземпляров в памяти, разрешения имен при вызове методов, создания машинного кода, обеспечения безопасности и установки границ контекста времени выполнения.

Среда выполнения автоматически обрабатывает макет объектов и управляет ссылками на объекты, освобождая их, когда они больше не используются. Объекты, время жизни которых управляется подобным образом, называются управляемыми данными. Сборка мусора устраняет утечки памяти и некоторые другие распространенные ошибки программирования. Если ваш код управляется, вы можете использовать управляемые, неуправляемые или управляемые и неуправляемые данные в приложении .NET. Так как компиляторы языка предоставляют собственные типы, такие как примитивные типы, вы не всегда знаете или не должны знать, управляются ли ваши данные.

Среда CLR упрощает разработку компонентов и приложений, объекты которых могут работать в разных языках. Объекты, написанные на разных языках, могут взаимодействовать друг с другом, а их поведение может быть тесно интегрировано. Например, разработчик может определить класс, а затем на другом языке создать производный от него класс или вызвать метод из исходного класса.

Можно также передать экземпляр класса в метод класса, написанного на другом языке. Эта межязыковая интеграция возможна, так как компиляторы и средства языка, предназначенные для среды выполнения, используют систему общего типа, определенную средой выполнения. Они следуют правилам среды выполнения для определения новых типов и создания, использования, сохранения и привязки к типам.

В составе своих метаданных все управляемые компоненты содержат сведения о компонентах и ресурсах, на базе которых они построены. Среда выполнения использует эти сведения, чтобы обеспечить наличие всех необходимых ресурсов для компонента или приложения. Это снижает вероятность сбоев кода из-за каких-либо неудовлетворенных зависимостей.

Сведения о регистрации и данные о состоянии больше не хранятся в реестре, где их может быть трудно установить и поддерживать. Вместо этого сведения о определяемых типах и их зависимостях хранятся вместе с кодом в виде метаданных. Таким образом, задача репликации и удаления компонентов менее сложна.

Читайте также:
Procby dll что это за программа

Языковые компиляторы и программы предоставляют функции среды выполнения так, чтобы они были полезны и интуитивно понятны для разработчиков. Некоторые функции среды выполнения могут быть более заметными в одной среде, чем в другой. Характеристики среды выполнения зависят от используемых языковых компиляторов и программ. Например, если вы разработчик Visual Basic, вы можете заметить, что в среде CLR язык Visual Basic имеет более объектно-ориентированные функции, чем раньше. Среда выполнения предоставляет следующие преимущества:

  • повышение производительности;
  • возможность легко использовать компоненты, разработанные на других языках;
  • расширяемые типы, предоставляемые библиотекой классов;
  • языковые возможности (например, наследование, интерфейсы и перегрузку) для объектно-ориентированного программирования;
  • Поддержка явного свободного потока, которая позволяет создавать многопоточные и масштабируемые приложения.
  • поддержку структурированной обработки исключений;
  • поддержку настраиваемых атрибутов;
  • сборка мусора;
  • использование делегатов вместо указателей на функции для повышения типобезопасности и уровня защиты. Подробнее о делегатах см. в разделе Система общих типов CTS.

Версии CLR

Выпуски .NET Core и .NET 5+ имеют одну версию продукта, то есть отдельную версию СРЕДЫ CLR нет. Список версий .NET Core см. в разделе Загрузка .NET Core.

Однако номер версии платформы .NET Framework не всегда соответствует номеру версии среды CLR, которую он содержит. Список версий .NET Framework и соответствующих версий среды CLR см. в разделе Версии и зависимости платформы .NET Framework.

Связанные статьи

Источник: learn.microsoft.com

Средства визуального программирования на языке С++. Среда CLR

Коптенок, Е. В. Средства визуального программирования на языке С++. Среда CLR / Е. В. Коптенок, А. В. Кузин. — Текст : непосредственный // Молодой ученый. — 2018. — № 19 (205). — С. 111-115. — URL: https://moluch.ru/archive/205/50253/ (дата обращения: 25.12.2022).

Для большинства современных программных продуктов применение консольного интерфейса является неактуальным в связи с отсутствием многих функциональных возможностей, например, управление мышью.

Оконный интерфейс решает большинство трудностей, с которыми сталкивается пользователь, облегчает управление программой, делает представление данных более наглядным, а функционал интуитивно понятным.

Для разработчика необходимо применение платформ и сред, позволяющих эффективно реализовать оконный интерфейс. В данной статье речь пойдет об общеязыковой среде исполнения CLR, являющейся основой платформы.NET компании Microsoft.

Существует несколько эффективных решений для программирования оконных приложений на языке C++. Например, кросплатформенный фреймворк Qt, позволяющий создавать приложения на многих популярных языках программирования: данная платформа является основой среды KDE, используемой во многих версиях ОС Iinux. Основным преимуществом является возможность компиляции для разных версий операционных систем без изменения исходного кода, наличие всех необходимых классов для работы как с обычными приложениями, так и с сетью, базами данных. Однако, данная платформа имеет и недостатки, например, большой объем приложений после разработки.

Одной из альтернатив QT является среда Common Language Runtime (CLR), архитектура которого определена спецификацией CLI (Common Language Infrastructure). Данная среда отвечает за ряд задач, основными являются изоляция памяти приложений, проверка типов, преобразования IL (набор инструкций, не зависящих от платформы) в машинный код и так далее. То есть, фактически, код приложения не компилируется в машинный код, но хранится в наборе инструкций на CIL, которые исполняются CLR для конкретной платформы. Таким образом, обеспечивается кросплатформенность при меньшем объеме исполняемых файлов. Наглядно представление о роли среды CLR при компиляции.NET приложений продемонстрирована на Рис. 1:

Рис. 1. Графическое представление роли CLR при компиляции программы

В среде разработки Microsoft Visual Studio реализована возможность создания приложений с оконным интерфейсом в среде CLR. Для удобства работы создан простой конструктор форм, позволяющий создать макет будущего приложения (Рис. 2):

Рис. 2. общий вид рабочего окна Microsoft Visual Studio при разработке оконного приложения

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

Отметим, что при добавлении элементов на форму, изменению их графических свойств (размер, положение на экране), в файле Имя_Формы.h автоматически генерируется необходимый код, а все элементы управления становятся членами класса формы.

Для каждого элемента можно настроить его основные свойства (Рис. 3 б), а также назначить методы — обработчики событий. Они включают в себя все возможные события, от создания объекта, до его удаления (в том числе, все возможные взаимодействия пользователя с объектом) (Рис. 3 в).

Рис. 3. а) Панель элементов; б) Свойства элемента; в) События элемента.

В результате средой будут описаны:

– Класс Имя_Формы — дочерний класс от Windows Forms, содержащий свойства и методы формы — рабочего окна приложения;

– Объекты классов, соответствующих элементам управления. Будут являться свойствами объекта класса Windows Forms, соответственно, через методы можно будет взаимодействовать с другими объектами, но только принадлежащими данной форме. Доступ к элементам управления одной формы из другой невозможен, так как две разные формы — это разные, не связанные друг с другом классы. Однако, они будут принадлежать общему пространству имен — пространству имен проекта;

– Методы-события формы и элементов управления, в которых программист может описать алгоритмы, которые нужно выполнить при возникновении того или иного события.

Таким образом, при создании программы соблюдаются все базовые принципы Объектно-Ориентированного Программирования.

Для связи данных между формами можно использовать библиотеку, содержащую описания статических переменных и структур, через которые экземпляры разных классов могут обмениваться данными в рамках одного пространства имен.

Используя среду CLR, была разработана программа, позволяющая создавать и редактировать шаблоны задач. Было создано несколько рабочих форм, обменивающихся данными друг с другом. Приложение было разработано с использованием стандартных библиотек и среды CLR и применением различных элементов управления. Примеры работы программы представлены ниже (Рис. 4, Рис. 5):

Рис. 4. Пример работы программы

Рис. 5. Пример работы программы

В ходе разработки программ с использованием среды CLR, были отмечены такие достоинства, как простота разработки макетов форм, удобное автоматическое описание классов форм и элементов управления, позволяющее эффективно связывать формы проекта, а также обеспечивающая инкапсуляцию и защиту целостности кода. Также следует выделить хорошую оптимизацию.

  1. Макки, А Введение в.NET 4.0 и Visual Studio 2010 для профессионалов — Москва, Вильямс, 2010–416 с.
  2. Михайлова А. Е., Дошина А. Д., Карлова В. В. Эволюция веб-фреймворков Microsoft. ASP.NET vNext (ASP.NET 5) [Текст] // Современные тенденции технических наук: материалы IV Междунар. науч. конф. (г. Казань, октябрь 2015 г.). — Казань: Бук, 2015. — С. 16–19. — URL https://moluch.ru/conf/tech/archive/163/8851/
  3. Практическое руководство. Создание проектов CLR. — URL https://msdn.microsoft.com/ru-ru/library/68td296t.aspx
  4. Программирование.NET с использованием C++/CLI (Visual C++). — URL https://docs.microsoft.com/ru-ru/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp

Основные термины (генерируются автоматически): CLR, элемент управления, оконный интерфейс, работа программы, CIL, CLI, KDE, машинный код, набор инструкций, Панель элементов.

Похожие статьи

Тестирование графического интерфейса (GUI testing)

Тестирование GUI участвует проверку экранов с элементами управления, такими как кнопки меню, иконка и все виды баров – панели инструментов, панели меню, диалоговым окном и т.д.

Пользователь не видит исходный код. Интерфейс виден пользователю.

Игровой интерфейс и управление игрой | Статья в журнале.

Первая — это интерфейс оболочки, представляющий собой набор различных меню: с его

Тестирование GUI участвует проверку экранов с элементами управления, такими как кнопки меню, иконка и все виды баров – панели инструментов, панели меню, диалоговым окном и т.д.

Читайте также:
Umts что это за программа

Основы работы с нотно-графическим редактором Sibelius 7

Представлена также пошаговая инструкция работы в редакторе Sibelius 7, что

Интерфейс Sibelius 7 (рис. 12) напоминает окно программы Microsoft Word 2010.

Справа в верхнем правом углу панели Title Bar находятся кнопки управления текущим окном Sibelius 7 (рис. 14).

Разработка модуля формирования документов студенческой.

Ежедневной работой многих пользователей компьютера является составление документации. С помощью разрабатываемой программы

Так же в них входит библиотека SWING, которая содержит набор элементов для создания графического интерфейса и средства работы с ним.

Общее определение программной среды используемой для.

Каждый компонент имеет конкретный набор свойств. Например, цвет, заголовок окна

После этих 3 этапов оформляется исполняемый машинный код этой программы.

Используя среду CLR, была разработана программа, позволяющая создавать и редактировать шаблоны задач.

Перспективы развития адаптации AutoCAD с помощью Clojure

. байт-код Common Intermediate Language (CIL), затем исполняется виртуальной машиной Common Language Runtime (CLR), либо

Приложение было разработано с использованием стандартных библиотек и среды CLR и применением различных элементов управления.

Аналого-цифровой преобразователь как базовый элемент.

Панель, сформированная на экране дисплея, так же, как и панель реального измерительного прибора, выполняет функции управления прибором.

Универсальная программа будет иметь более сложный интерфейс, а также

Алгоритм работы программы заключается в следующем.

Программирование изменения скважности импульсов ШИМ на.

Порты ввода-вывода (GPIO) — это основной элемент любого микроконтроллера.

В данной работе для изменения скважности импульсов ШИМ необходимо подключить кнопку.

Алгоритм набора кода в программе CoIDE состоит в следующем

Источник: moluch.ru

Visual Studio .Net, Framework .Net

Наиболее революционным изобретением Framework .Net явилось создание исполнительной среды CLR . С ее появлением процесс написания и выполнения приложений становится принципиально другим. Но обо всем по порядку.

Двухэтапная компиляция. Управляемый модуль и управляемый код

Компиляторы языков программирования, включенные в Visual Studio .Net , создают модули на промежуточном языке MSIL (Microsoft Intermediate Language) , называемом далее просто — IL. Фактически компиляторы создают так называемый управляемый модуль — переносимый исполняемый файл (Portable Executable или PE-файл). Этот файл содержит код на IL и метаданные — всю необходимую информацию как для CLR , так и конечных пользователей, работающих с приложением. О метаданных — важной новинке Framework .Net — мы еще будем говорить неоднократно. В зависимости от выбранного типа проекта, PE-файл может иметь расширения exe, dll, mod или mdl.

Заметьте, PE-файл, имеющий расширение exe, хотя и является exe-файлом, но это не совсем обычный исполняемый Windows файл. При его запуске он распознается как специальный PE-файл и передается CLR для обработки. Исполнительная среда начинает работать с кодом, в котором специфика исходного языка программирования исчезла. Код на IL начинает выполняться под управлением CLR (по этой причине код называется управляемым ). Исполнительную среду можно рассматривать как своеобразную виртуальную IL-машину. Эта машина транслирует «на лету» требуемые для исполнения участки кода в команды реального процессора, который в действительности и выполняет код.

Виртуальная машина

Отделение каркаса от студии явилось естественным шагом. Каркас Framework .Net перестал быть частью студии, а стал надстройкой над операционной системой. Теперь компиляция и создание PE-модулей на IL отделены от выполнения, и эти процессы могут быть реализованы на разных платформах. В состав CLR входят трансляторы JIT (Just In Time Compiler ), которые и выполняют трансляцию IL в командный код той машины, где установлена и функционирует исполнительная среда CLR . Конечно, в первую очередь Microsoft реализовала CLR и FCL для различных версий Windows, включая Windows 98/Me/NT 4/2000, 32 и 64-разрядные версии Windows XP и семейство .Net Server. Для операционных систем Windows CE и Palm разработана облегченная версия Framework .Net .

В 2001 году ECMA (Европейская ассоциация производителей компьютеров) приняла язык программирования C#, CLR и FCL в качестве стандарта, так что Framework .Net уже функционирует на многих платформах, отличных от Windows. Он становится свободно распространяемой виртуальной машиной. Это существенно расширяет сферу его применения. Производители различных компиляторов и сред разработки программных продуктов предпочитают теперь также транслировать свой код в IL, создавая модули в соответствии со спецификациями CLR . Это обеспечивает возможность выполнения их кода на разных платформах.

Microsoft использовала получивший широкое признание опыт виртуальной машины Java, улучшив процесс за счет того, что, в отличие от Java, промежуточный код не интерпретируется исполнительной средой, а компилируется с учетом всех особенностей текущей платформы. Благодаря этому создаются высокопроизводительные приложения.

Следует отметить, что CLR , работая с IL-кодом, выполняет достаточно эффективную оптимизацию и, что не менее важно, защиту кода. Зачастую нецелесообразно выполнять оптимизацию на уровне создания IL-кода — она иногда может не улучшить, а ухудшить ситуацию, не давая CLR провести оптимизацию на нижнем уровне, где можно учесть даже особенности процессора.

Дизассемблер и ассемблер

Если у вас есть готовый PE-файл, то иногда полезно анализировать его IL-код и связанные с ним метаданные . В состав Framework SDK входит дизассемблер — ildasm, выполняющий дизассемблирование PE-файла и показывающий метаданные , а также IL-код с комментариями в наглядной форме. Мы иногда будем пользоваться результатами дизассемблирования. У меня на компьютере кнопка, вызывающая дизассемблер , находится на панели, где собраны наиболее часто используемые мной приложения. Вот путь к папке, в которой обычно находится дизассемблер :

C:Program FilesMicrosoft Visual Studio .Net FrameworkSDKBinildasm.exe

Профессионалы, предпочитающие работать на низком уровне, могут программировать на языке ассемблера IL. В этом случае в их распоряжении будет вся мощь библиотеки FCL и все возможности CLR . У меня на компьютере путь к папке, где находится ассемблер , следующий:

C:WINDOWSMicrosoft.NetFrameworkv1.1.4322ilasm.exe

В этом курсе к ассемблеру мы обращаться не будем — я упоминаю о нем для полноты картины.

Метаданные

Переносимый исполняемый PE-файл является самодокументируемым файлом и, как уже говорилось, содержит и код, и метаданные , описывающие код. Файл начинается с манифеста и включает в себя описание всех классов, хранимых в PE-файле, их свойств, методов, всех аргументов этих методов — всю необходимую CLR информацию.

Поэтому помимо PE-файла не требуется никаких дополнительных файлов и записей в реестр — вся нужная информация извлекается из самого файла. Среди классов библиотеки FCL имеется класс Reflection , методы которого позволяют извлекать необходимую информацию. Введение метаданных — не только важная техническая часть CLR , но это также часть новой идеологии разработки программных продуктов. Мы увидим, что и на уровне языка C# самодокументированию уделяется большое внимание.

Мы увидим также, что при проектировании класса программист может создавать собственные атрибуты, добавляемые к метаданным PE-файла. Клиенты этого класса могут, используя класс Reflection , получать эту дополнительную информацию, и на ее основании принимать соответствующие решения.

На рис. 1.1 показаны результаты дизассемблирования PE-файла простого консольного приложения с именем Account , включающего три класса: Account , Testing и Class1 . Дизассемблер структурирует информацию, хранимую в метаданных , и показывает ее в типичном формате дерева. Как обычно, это дерево можно сжимать или раскрывать, демонстрируя детали класса.

Значки, приписываемые каждому узлу дерева, характеризуют тип узла — класс, свойство, метод, описание. Двойной щелчок кнопки мыши на этом узле позволяет раскрыть его. При раскрытии метода можно получить его код. На рис. 1.1 показан код метода add из класса Account .

Источник: intuit.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru