Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Общеязыковая среда выполнения
В дополнение к спецификациям CTS и CLS, последней на данный момент аббревиатурой, которую мы рассмотрим, будет аббревиатура CLR (Common Language Runtime – общеязыковая среда выполнения). Для программирования термин среда, выполнения можно понимать, как набор внешних сервисов, необходимых для выполнения данной скомпилированной единицы программного кода. Например» когда разработчик при создании нового приложения использует библиотеку базовых классов Microsoft (MFC), он знает, что для выполнения его программы потребуется соответствующий выполняемый модуль библиотеки MFC (т.е. mfc42.dll). Другие популярные языки также предлагают соответствующие выполняемые модули. Программисты VB6 привязаны к одному или двум выполняемым модулям (например, msvbvm60.dll). Разработчики Java привязаны к виртуальной машине Java (JVM) и т.д.
Платформа .NET предлагает совсем другой принцип организации среды выполнения. Разница между средой выполнения .NET и средой выполнения, о которой говорилось выше, заключается в том, что среда выполнения .NET обеспечивает единый и вполне определенный "слой" выполнения, общий для всех языков и платформ, совместимых с .NET.
Основной механизм CLR физически заключается в библиотеке, называемой mscoree.dll (известной также под названием Common Object Runtime Execution Engine – общий объектный модуль механизма выполнения). Когда на компоновочный блок ссылаются для использования, mscoree.dll автоматически загружается и, в свою очередь, загружает в память требуемый компоновочный блок. Механизм выполнения отвечает за целый ряд задач. Прежде всего, и это самое главное, за выяснение расположения компоновочного блока и нахождение запрашиваемого типа в бинарном объекте с помощью чтения содержащихся там метаданных. Затем среда CLR размещает тип в памяти, преобразует CIL-код в соответствующие платформе инструкции, выполняет все необходимые проверки безопасности, а затем выполняет полученный программный код.
Вдобавок к загрузке созданных вами компоновочных блоков и созданию пользовательских типов, CLR также, если это необходимо, взаимодействует с типами, содержащимися в библиотеках базовых классов .NET. Хотя вся библиотека базовых классов разбита на целый ряд отдельных компоновочных блоков, "ключевым" компоновочным блоком является mscorlib.dll. Файл mscorlib.dll содержит множество базовых типов, которые объединяют в себе решения широкого спектра общих задач программирования, а также базовые типы данных, используемые всеми языками .NET. При построении .NET-приложений вы автоматически получаете доступ к этому специальному компоновочному блоку.
На рис. 1.3 показана система связей, возникающих между вашим исходным кодом (использующим типы из библиотеки базовых классов), .NET-компилятором и механизмом выполнения .NET.
Различия между компоновочными блоками, пространствами имен и типами
Каждый из нас понимает важность библиотек программного кода. Цель библиотек, таких как MFC, J2EE или ATL, – дать разработчику готовый набор блоков уже существующего программного кода, опираясь на которые можно строить новые приложения. Но язык C# не предлагает библиотек с программным кодом для конкретного языка. Разработчики C# могут использовать .NET-библиотеки, нейтральные в языковом отношении. Для того чтобы все типы в библиотеках базовых классов были правильно организованы, платформа .NET предлагает использовать понятие пространства имен.
Упрощенно говоря, пространство имен является группой связанных типов, содержащихся в компоновочном блоке. Например, пространство имен System.IO содержит типы, связанные с операциями ввода-вывода, пространство имен System.Data определяет основные типы для работы с базами данных и т.д. Важно понимать, что один компоновочный блок (такой как, например, mscorlib.dll) может содержать любое число пространств имен, каждое из которых может, в свою очередь, содержать любое число типов.
Чтобы ситуация стала более ясной, взгляните на рис. 1.4, на котором показан снимок окна Object Browser из Visual Studio 2005. Этот инструмент позволяет видеть компоновочные блоки, на которые ссылается текущий проект, пространства имен, содержащиеся в компоновочных блоках, типы, существующие в пределах данного пространства имен, и члены каждого типа.
Обратите внимание на то, что mscorlib.dll содержит очень много самых разных пространств имея, и в каждом из этих пространств имен содержатся свои семантически связанные типы.
Рис. 1.3. Модуль mscoree.dll в действии
Основным отличием этого подхода от таких зависящих от конкретного языка библиотек, как MFC, является то, что в результате все языки, поддерживаемые в среде выполнения .NET используют одни и те же пространства имен и одни и те же типы.
Рис.1.4. Один компоновочный блок может содержать любое количество пространств имен
Для иллюстрации рассмотрим следующие три программы, представляющие вариации вездесущего примера "Hello World" соответственно на C#, VB .NET и Managed Extensions for C++.
// Hello world на языке C#
using System;
public class MyApp {
static void Main() {
Console.WriteLine("Привет из C#");
}
}
' Hello world на языке VB .NET
Imports System
Public Module MyApp
Sub Main()
Console.WriteLine("Привет из VB .NET")
End Sub
End Module
// Hello world на языке Managed Extensions for C++
#include "stdafx.h"
using namespace System;
int main(array‹System::String^› ^args) {
Console::WriteLine("Привет из managed C++");
return 0;
}
Заметим, что здесь в любом из языков используется класс Console, определенный в пространстве имен System. Если отбросить незначительные синтаксические вариации, то эти три приложения выглядят очень похожими, как по форме, так и по логике.
Очевидно, вашей главной целью, как разработчика .NET. является получение исчерпывающей информации обо всем разнообразии типов, определенных в рамках (многочисленных) пространств имен .NET. Главным из пространств имен, о которых следует знать, является System. Это пространство имен предлагает базовый набор типов, которые вы, как разработчик .NET. будете использовать снова и снова. Фактически вы не сможете построить ни одного реально работающего C#-приложеиия, не сославшись, как минимум, на пространство имен System. В табл. 3.4 предлагаются краткие описания некоторых (но, конечно же, не всех) пространств имен .NET.
Таблица 1.4. Пространства имен .NET
Пространства имен .NET Описание System В рамках System вы найдете множество полезных типов, связанных с внутренними данными, математическими вычислениями, переменными окружения, генерированием случайных чисел и сбором мусора, а также с обработкой типичных исключительных ситуаций и атрибутов System.Collections System.ColIections.Generiс Эти пространства имен определяют ряд контейнерных объектов (ArrayList, Queue и т.д.), а также базовых типов и интерфейсов, которые позволяют строить пользовательские коллекции. В .NET 2.0 типы коллекций обладают дополнительными общими возможностями System.Data System.Data.Odbc System.Data.OracleClient System.Data.OleDb System.Data.SqlClient Эти пространства имен используются для взаимодействия с базами данных на основе ADO.NET System.Diagnostics Здесь вы найдете множество типов, которые могут использоваться для программной отладки и трассировки исходного кода System.Drawing System.Drawing.Drawing2D System.Drawing.Printing Здесь вы найдете множество типов для работы с графическими примитивами, такими как растровые изображения, шрифты и пиктограммы, а также для вывода на печать System.IO System.IO.Compression System.IO.Ports Эти пространства имен включают средства файлового ввода-вывода, буферизации и т.д. В .NET 2.0 пространства имен IO предлагают поддержку сжатия и работы с портами System.Net Это пространство имен (как и другие родственные пространства имен) содержит типы, связанные с сетевым программированием (запросы/ответы, сокеты, конечные точки соединений и т.д.) System.Reflection System.Reflection.Emit Эти пространства имен определяют типы, связанные с обнаружением типов в среде выполнения и динамическим созданием типов System.Runtime.InteropServices Это пространство имен обеспечивает средства взаимодействия типов .NET с "неуправляемым программным кодом" (это, например, DLL на базе C и COM-серверы) System.Runtime.Remoting Это пространство имен (среди прочих) определяет типы, используемые для построения решений на основе возможностей слоя удаленного доступа .NET System.Security Безопасность – это неотъемлемый аспект платформы .NET. В пространствах имен, объединенных идеей безопасности, вы найдете множество типов, связанных с разрешением доступа, криптографической защитой и т.д. System.Threading Это пространство имен определяет типы, используемые при построении многопоточных приложений System.Web Ряд пространств имен, специально предназначенных для разработки Web-приложений .NET, включая Web-сервисы ASP.NET и XML System.Windows.Forms Это пространство имен содержит типы, которые упрощают процесс создания традиционных GUI-приложений (приложений с графическим интерфейсом) для настольных систем System.Xml Связанные с XML пространства имен, содержащие множество типов, используемых для взаимодействия с XML-даннымиПрограммный доступ к пространствам имен