Базовые понятия технологии .NET Framework 1. Что являет собой среда .NET Framework? .NET Framework служит средой для поддержки, разработки и выполнения распределенных приложений, которые базируются на компонентах (элементах управления). Приложения (программы) можно разрабатывать на разных языках программирования, которые поддерживают эту технологию. .NET Framework обеспечивает: совместное использование разных языков программирования; безопасность и переносимость программ; общую модель программирования на базе платформы Windows. 2. Какие основные составляющие .NET Framework? С точки зрения программирования, .NET Framework состоит из двух основных составляющих: общеязыковая исполнительная среда CLR (Common Language Runtime); библиотека базовых классов. Общеязыковая среда CLR решает задачи автоматического выявления типов .NET, загрузки этих типов и управление ними. Среда CLR осуществляет управление памятью, обслуживание приложения, обработку потоков и реализует многочисленные проверки связанные с безопасностью. Библиотека базовых классов включает в себя определение разнообразных примитивов, которыми могут быть: потоки, графические APIинтерфейсы, реализация баз данных, файловый ввод-вывод и прочее. 3. Какой принцип действия общеязыковой среды выполнения CLR (Common Language Runtime)? Общеязыковая среда выполнения CLR управляет выполнением кода .NET. После компиляции программы на C# (или другом языке) создается файл, который содержит особого рода псевдокод или байт-код (а не исполнительный файл, как было раньше). Этот псевдокод называется Microsoft Intermediate Language (MSIL) или Common Intermediate Language (CIL). Этот псевдокод есть промежуточным языком Microsoft. Основное назначение CLR – превратить промежуточный код MSIL в исполнительный код в процессе выполнения программы. Любая программа, которая скомпилирована в псевдокод MSIL, может быть выполнена в любой среде, которая содержит реализацию CLR. Это обеспечивает переносность программ в среде .NET Framework. Рис. 1. Процесс преобразования исходного кода в код на языке MSIL (CIL или IL) и создание файла сборки (*.dll или *.exe) После этого, псевдокод превращается в исполняемый код. Это осуществляет JIT компилятор. JIT (Just-in-time) -компиляция – это компиляция на «лету». Исполнительная среда CLR отвечает за определение места размещения сборки (assembly). Запрашиваемый тип, который размещается в сборке (например, класс ArrayList или другой тип), определяется в двоичном файле (*.dll или *.exe) с помощью считывания метаданных этого файла. После этого CLR размещает в памяти считанный из сборки тип. Затем CLR превращает CIL-код в соответствующие инструкции, которые подстраиваются под конкретную платформу (в зависимости от ПК, операционной системы и т.п.). Кроме того, на этом этапе происходят необходимые проверки на предмет безопасности. Последним происходит выполнение запрашиваемого программного кода. 4. Что такое промежуточный язык MSIL (Microsoft Intermediate Language) или CIL (Common Intermediate Language)? Сперва промежуточный язык псевдокода назывался Microsoft Intermediate Language (MSIL). Позднее (в последних версиях .NET) это название было изменено на Common Intermediate Language (CIL — общий промежуточный язык). Аббревиатуры MSIL, CIL и IL (Intermediate Language)означают одно и то же. Промежуточный язык CIL (или MSIL) формируется после компиляции программы на некотором языке программирования, который поддерживает платформу .NET Framework. MSIL есть псевдокодом. MSIL определяет набор инструкций, которые: могут переноситься на разные платформы; не зависят от конкретного процессора. Фактически, MSIL – это язык переносного ассемблера 5. Что такое сборка (assembly) с точки зрения технологии .NET? Сборки – это файлы с расширениями *.dll или *.exe, которые содержат независимые от платформы .NET инструкции на промежуточном языке (Intermediate Language – IL), а также метаданные типов. Сборка создается с помощью .NET компилятора. Сборка – это большой двоичный объект. Сборка предназначена для сохранения пространств имен (namespaces). Пространства имен содержат типы. Типами могут быть классы, делегаты, интерфейсы, перечисления, структуры. Сборка может содержать любое количество пространств имен. Любое пространство имен может содержать любое количество типов (классов, интерфейсов, структур, перечислений, делегатов). 6. Что размещается в сборках? В сборках размещается CIL-код (MSIL-код или IL-код) и метаданные. CIL-код компилируется под конкретную платформу только тогда, если происходит обращение к нему из исполняющей среды .NET. Метаданные детально описывают особенности каждого типа, который есть внутри данной двоичной .NET единицы. Например, при создании приложения типа Windows Forms Application в C# создается файл Assembly.info. Этот файл размещается в подпапке Properties относительно основной папки программы. В этом файле указывается общая информация о сборке. 7. Что такое манифест (manifest)? Манифест – это описание самой сборки с помощью метаданных. В манифесте размещается информация: о текущей версии сборки; сведения о культуре (локализация строчных и графических ресурсов); перечень ссылок на все внешние сборки, которые нужны для правильного функционирования. 8. Схема взаимодействия между исходным кодом, компилятором .NET и механизмом выполнения .NET. Программист создает исходный код приложения на языке, который поддерживает технологию .NET (языке C#, C++/CLI, Visual Basic .NET и т.д.). Приложение создается в некоторой среде программирования, например Microsoft Visual Studio. Компилятор формирует сборку – файл, который содержит CIL-инструкции, метаданные и манифест. После запуска на выполнение этого приложения на некотором компьютере (некоторой платформе), в работу запускается механизм выполнения .NET. Предварительно, на компьютере должна быть установлена одна из версий (как минимум) .NET Framework. Если в исходном коде используются библиотеки базовых классов (например из сборки mscorlib.dll), то они загружаются с помощью загрузчика классов. JIT-компилятор осуществляет компиляцию сборки с учетом (привязкой) аппаратных и программных особенностей компьютера, на котором происходит запуск приложения. После этого приложение выполняется. Рисунок 2. Связь между исходным кодом, компилятором и механизмом выполнения .NET 9. Какие существуют виды сборок? Существует два вида сборок: однофайловые сборки; многофайловые сборки. Сборка, которая состоит из одного единого модуля (*.dll или *.exe) называется однофайловой. В однофайловых сборках все необходимые CIL-инструкции, метаданные и манифесты размещаются в одном, четко определенном пакете. Сборка, которая состоит из многих файлов двоичного кода .NET, называется многофайловой. Каждый из этих файлов называется модулем. В многофайловой сборке один из модулей есть главным (primary). 10. В каком файле размещается главная сборка библиотеки MS Visual Studio? Главная сборка размещается в файле “mscorlib.dll”. 11. Что такое общая система типов CTS? CTS (Common Type System) – система типов, которая содержит полное описание всех возможных типов данных и программных конструкций, которые поддерживаются общеязыковой исполнительной средой CLR. Также здесь описывается то, как эти сущности могут взаимодействовать между собою. Типами могут быть классы, интерфейсы, структуры, перечисления, делегаты. 12. Какое назначение общеязыковой спецификации CLS? Как известно, не все языки программирования, которые являются совместимыми с .NET, могут поддерживать функциональные возможности системы типов CTS. Для этого используется общеязыковая спецификация CLS (Common Language Specification). Задачей CLS есть описание только того подмножества общих типов и программных конструкций, которые воспринимаются абсолютно всеми языками программирования, которые поддерживают .NET. 13. Какие языки программирования поддерживают технологию .NET? В системе разработки приложений MS Visual Studio технологию .NET поддерживают следующие языки программирования: C#, Visual Basic .NET, C++/CLI, JScript .NET, F#, J#. Для того, чтобы можно было использовать технологию .NET нужно установить на компьютере программное обеспечение Microsoft .NET Framework Software Development Kit (SDK) или Microsoft Visual Studio любой версии. 14. Что такое пространство имен (namespace)? Пространство имен предназначено для объединения группы типов, которые связаны между собою с семантической точки зрения. Типы размещаются в сборках (assembly). Под типами понимаются классы, делегаты, интерфейсы, структуры, перечисления. Примеры названий пространств имен: System System.Data System.IO System.Collections System.Threading.Tasks Например, в пространстве имен System.Data размещаются основные типы для работы с базами данных, в пространстве имен System.Collections размещаются основные типы для работы с коллекциями. 15. Как вывести содержимое сборок, пространств имен и типов в MS Visual Studio? В системе Microsoft Visual Studio есть утилита Object Browser, которая вызывается с меню View (рисунок 3). Рис. 3. Вызов утилиты Object Browser В результате откроется окно Object Browser, в котором будут отображаться сборки, которые используются в определенной технологии. На рисунке 4 отображен список сборок, которые отображаются в технологии “.NET Framework 4”. Выделена сборка с именем “mscorlib”. Рис. 4. Окно Object Browser с выделенной сборкой mscorlib.dll Если раскрыть содержимое сборки mscorlib (знак “+”), то будет отображен список всех пространств имен данной сборки (рисунок 5). Как видно из рисунка, сборка включает пространства имен Microsoft.Win32, System, System.Collections, System.Collections.Concurrent и много других. Рис. 5. Сборка mscorlib и список пространств имен, которые входят в нее Аналогично раскрывается любое из пространств имен. В пространствах имен описываются типы. В типах описываются методы, свойства, константы и т.п. На рисунке 6 изображен класс BinaryReader из пространства имен System.IO. По всей видимости, в классе реализованы методы с именами BinaryReader(), Close(), Dispose(), FillBuffer() и прочие. Рис. 6. Содержимое класса BinaryReader 16. Как подключить пространство имен в программе на C#? Для подключения пространства имен используется ключевое слово using. Примеры подключения пространств имен: using System; // подключение пространства имен System using System.IO; // подключение пространства имен System.IO using System.Windows.Forms; После подключения пространства имен можно обращаться к типам, которые в них реализованы.