Читать в оригинале

<< ПредыдущаяОглавлениеСледующая >>


1.3.3. Особенности разработки приложений .NET

Хотя архитектура .NET и гарантирует языковую совместимость между приложениями и внутри приложений, для реализации этой возможности при разработке приложений необходимо следовать некоторым правилам. И дело здесь не в ограниченности возможностей .NET, а в принципиальных трудностях. Например, как быть, если один язык программирования поддерживает беззнаковые типы данных (Delphi, C++), а другой (Java) - нет? Что делать, если один компилятор допускает перегружаемые методы, а другой - нет? Каким должен быть в таких случаях код MSIL?

Как видно, объективные трудности существуют, и для их преодоления в архитектуру .NET включен ряд спецификаций.

В .NET введено логическое понятие пространства имен, которое служит идентификации типов в общих библиотеках и приложениях.

Приложения должны использовать общую систему типов (Common Type System), объединяющую типы данных и операций, присутствующие в большинстве языков программирования.

При написании исходного кода приложений необходимо руководствоваться некоторыми правилами, которые объединены под названием Common Language Specification.

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

 

Пространства имён

 

В .NET применяются пространства имен. Пространство имен - это логическая структура, объединяющая в своем составе другие пространства имен и типы. Ее основное предназначение - идентификация типов (в .NET под типом понимаются и классы, и интерфейсы) и предотвращение конфликтов именования типов. Пространства имен могут быть стандартными или созданными разработчиком.

Типы именуются только с использованием названий пространств имен. Например, существует стандартное пространство имен System.IO, которое объединяет типы, отвечающие за выполнение операций файлового ввода/вывода. Как видно из представления, пространство имен IO - часть глобального пространства System. При помощи операторов используемого языка программирования вы можете добавить к приложению функции того или иного пространства имен. Концепция в чем-то аналогична модулям Delphi для Win32.

Если требуется определить новый тип, то это должно быть сделано в рамках соответствующего пространства имен. К примеру, можно определить тип для хранения имен файлов XML для операций ввода/вывода и тогда обращение к нему в приложении .NET будет выглядеть так: System.IO.XMLFileName.

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

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

 

Общая система типов

 

Общая система типов (Common Type System, CTS) - это спецификация, которая объединяет все типы и операции, доступные в приложениях .NET. Она разработана путем анализа основных языков программирования высокого уровня, используемых в .NET, и является составной частью среды выполнения CLR, которая посредством CTS осуществляет верификацию кода и обеспечивает безопасность выполнения приложений.

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

 

Правила межъязыкового взаимодействия

 

Для того чтобы приложение (или его фрагмент) правильно воспринималось другими приложениями, написанными на другом языке программирования, оно должно быть разработано с учетом правил спецификации Common Language Specification (CLS). CLS - это набор правил и ограничений, обеспечивающих полную интеграцию кодов, созданных в разных средах разработки и на разных языках программирования. Программный код, созданный с учетом правил межъязыкового взаимодействия, называется CLS- совместимым.

При разработке обычных приложений знание правил CLS не требуется (или требуется в общих чертах для того, чтобы писать более эффективный код). Всю работу по обеспечению правил CLS берет на себя компилятор. Но если вы работаете над каким-либо API, который будет задействован в других приложениях, или ваши сборки будут использованы другими, то знания CLS необходимы.

 

Среда выполнения приложений .NET

 

В зависимости от компилятора, приложения .NET могут быть двух типов: с управляемым и неуправляемым кодом. Компилятор Borland DCCIL, а также компиляторы Microsoft C#, C++, Visual Basic в основном генерируют управляемый код.

Для приложений с управляемым кодом обязательным условием работы является наличие Common Language Runtime — среды выполнения приложений .NET. Среда выполнения реализована в виде динамической библиотеки mscoree.dll. При попытке выполнить приложение .NET (если вы запускаете файл ЕХЕ или DLL приложения .NET) эта динамическая библиотека загружается автоматически и управляет процессом выполнения приложения. Она проводит приложение через следующие операции:

1. поиск файлов, запрашиваемых сборкой и их загрузка;

2. контроль версий и обеспечение безопасности;

3. поиск запрашиваемых типов внутри сборки;

4. компиляция кода MSIL в платформенно-зависимый код;

5. выполнение откомпилированного кода.

В состав среды выполнения (Рис.4) входят следующие функциональные блоки.

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

Рисунок 4. Схема работы компиляторов .NET

Компилятор Just In Time (JIT), который транслирует только необходимый код MSIL (как правило, это отдельные процедуры) в платформенно-зависимый машинный код и сохраняет результат в оперативной памяти.

Компилятор Native Image Generator (NGEN), который обрабатывает все приложение и сохраняет результат на жестком диске.

Менеджер выполнения приложения, который обеспечивает выполнение откомпилированного кода и предоставляет приложению дополнительные службы.

К дополнительным службам, предоставляемым менеджером выполнения, относятся:

выделение памяти приложению - для впервые используемых откомпилированных блоков кода выделяется оперативная память и в дальнейшем код остается загруженным на случай повторного применения;

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

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

 



<< ПредыдущаяОглавлениеСледующая >>