Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

 

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

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

Промежуточный язык CIL

Промежуточный язык CIL

 

Промежуточный язык 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). Типы значений обычно хранятся в стеке (хотя, если типы значений объявлены как поля внутри ссылочных типов, то они также будут сохранены в управляемой куче).

 

Утилита ildasm.exe

 

Утилита ildasm.exe ( Intermediate Language Disassembler дизассемблер промежуточного языка ), которая поставляется в составе пакета .NET Framework 4 SDK, позволяет загружать любую сборку.NET и изучать её содержимое, в том числе ассоциируемый с ней манифест, CIL-код и метаданные типов. По умолчанию эта утилита установлена по следующему пути (для Windows 7)^ С:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin (если здесь её нет, нужно искать на компьютере файл по имени «ildasm.exe»).

 

Утилиту IL DASM («Дизассемблер IL», файл ildasm.exe) можно найти по умолчанию по следующему пути (для Windows 7): Пуск -> Все программы -> Microsoft Visual Studio 2010 -> Microsoft Windows SDK Tools -> Дизассемблер IL. Главное окно утилиты выглядит так:

 

Рис. 2. 1. Окно утилиты IL DASM (ildasm.exe)

 

Также, утилиту можно вызвать через командную строку (Пуск -> Все программы -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Командная строка Visual Studio (2010)), введя строчку «ildasm» и нажав Enter:

 

Рис. 2. 2. Вызов утилиты ildasm.exe через командную строку среды разработки Visual Studio 2010

 

Давайте сначала составим простейшую сборку (скомпилируем в среде разработки консольное приложение; такой тип проектов можно найти на вкладке Установленные шаблоны -> Visual C # при создании нового проекта):

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

int a = 10;

Console.WriteLine(a);

Console.ReadLine();

}

}

}

 

Скомпилируем (в любой доступной конфигурации: Debug или Release) и откроем получивший EXE файл через утилиту ildasm.exe:

 

Рис. 2. 3. Открываем скомпилированное приложение LC_Console.exe (с кодом выше) утилитой IL DASM

 

Помимо содержащихся в сборке пространств имен, типов и членов, утилита ildasm.ехе также позволяет просматривать и CIL-инструкции, которые лежат в основе каждого конкретного члена. Например, в результате двойного щелчка на методе Main в классе Program открывается отдельное окно с CIL-кодом, лежащим в основе этого метода:

 

Рис. 2. 4. CIL-код метода Main

 

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

 

Рис. 2. 5. Окно MetaInfo утилиты IL DASM для приложения LC_Console.exe

 

И, наконец, чтобы просмотреть содержимое манифеста сборки, необходимо дважды щёлкнуть на значке MANIFEST:

 

Рис. 2. 6. Окно MANIFEST утилиты IL DASM для приложения LC_Console.exe

 

Несомненно, утилита ildasm.ехе обладает большим, чем было показано здесь количеством функциональных возможностей.



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 592; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.102.43 (0.011 с.)