Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

4. Однофайловые и многофайловые сборки

В большом количестве случаев между сборками .NET и файлами двоичного кода (*.dll или *.ехе) соблюдается простое соответствие «один к одному». Следовательно, получается, что при построении DLL-библиотеки .NET, можно спокойно полагать, что файл двоичного кода и сборка представляют собой одно и то же, и что, аналогичным образом, при построении исполняемого приложения для настольной системы на файл EXE можно ссылаться как на саму сборку. Однако это не совсем так. С технической точки зрения, сборка, состоящая из одного единственного модуля *.dll или *.ехе, называется однофайловой сборкой. В однофайловых сборках все необходимые CIL-инструкции, метаданные и манифесты содержатся в одном автономном четко определенном пакете.

Многомофайловые сборки, в свою очередь, состоят из множества файлов двоичного кода .NET, каждый из которых называется модулем (module). При построении многофайловой сборки в одном из её модулей (называемом первичным или главным (primary) модулем) содержится манифест (объявление) самой сборки (и, возможно, СIL-инструкции и метаданные по различным типам), а во всех остальных — манифест, CIL-инструкции и метаданные типов, охватывающие уровень только соответствующего модуля. Как нетрудно догадаться, в главном модуле содержится описание набора требуемых дополнительных модулей внутри манифеста сборки.

2.6. Промежуточный язык cil Промежуточный язык cil

1. Промежуточный язык cil

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

Важнейшие свойства CIL могут быть сформулированы следующим образом:

  • объектная ориентация и применение интерфейсов;

  • строгое различие между типами значений и типами ссылок;

  • строгая типизация данных;

  • обработка ошибок через использование исключений;

  • применение атрибутов.

Давайте рассмотрим первые два свойства более подробно:

1. Поддержка объектной ориентации и интерфейсов.

Независимость .NET от языка имеет некоторые практические ограничения. IL неизбежно должен воплощать некоторую определенную методологию программирования, а это означает, что исходный язык также должен быть совместим с этой методологией. Принцип, которым руководствовались в Microsoft при создании IL: классическое объектно-ориентированное программирование с реализацией одиночного наследования классов.

В дополнение к классической объектной ориентации в языке IL также введено понятие «Интерфейс», которое впервые было реализованы под Windows с появлением СОМ. Интерфейсы, построенные с использованием .NET — это не то же самое, что интерфейсы СОМ; им не требуется поддержка со стороны инфраструктуры СОМ (так, например, они не наследуются от IUnknown и не имеют ассоциированных глобальных идентификаторов (Globally Unique Identifier ― GUID). Однако они разделяют с интерфейсами СОМ идею предоставления контракта, и классы, реализующие заданный интерфейс, должны предлагать реализацию методов и свойств, специфицированных этим интерфейсом.

Так же, язык CIL имеет способность языкового взаимодействия, под которой подразумевается возможность для классов, написанных на одном языке, напрямую обращаться к классам, написанным на другом языке, т.е.:

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

  • класс может содержать экземпляр другого класса, независимо от того, на каких языках написан каждый из них;

  • объект может напрямую вызывать методы другого объекта, написанного на другом языке;

  • объекты (или ссылки на объекты) могут передаваться между методами;

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

2. Различие типов значений и типов ссылок.

Как и любой язык программирования, IL предлагает множество предопределенных примитивных типов данных. Одна из особенностей IL, однако, заключается в том, что он делает четкое различие значениями и ссылочными типами. Типы значений — это те, переменные которых непосредственно хранят их данные. Ссылочные типы — это те, переменные которых просто хранят адрес, по которому соответствующие данные могут быть найдены.

В терминах С++, ссылочные типы можно рассматривать, как будто они обращаются к переменным через указатель, в то время как для Visual Basic лучшая аналогия для ссылочных типов — это объекты, обращение к которым в Visual Basic 6 всегда осуществляется по ссылке. В языке IL также установлена своя спецификация относительно хранения данных: экземпляры ссылочных типов всегда хранятся в области памяти, известной как управляемая куча (managed heap). Типы значений обычно хранятся в стеке (хотя, если типы значений объявлены как поля внутри ссылочных типов, то они также будут сохранены в управляемой куче).