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

2. Утилита 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.ехе обладает большим, чем было показано здесь количеством функциональных возможностей.

2.7. Классы .Net Framework и пространства имён Классы .Net Framework и пространства имён

1. Классы .Net Framework

Возможно, наибольшее преимущество написания управляемого кода — по крайней мере, с точки зрения разработчика — состоит в том, что он, разработчик получает возможность использовать библиотеку базовых классов .NET (Base Class Library).

Базовые классы .NET представляют огромную коллекцию классов управляемого кода, позволяющие решать практически любые задачи, которые раньше можно было решать с помощью Windows API. Все эти классы следуют той же объектной модели IL с одиночным наследованием. Это значит, что можно либо создавать объекты любого из базовых классов .NET, либо наследовать от них собственные классы.

Отличие базовых классов .NET заключается в том, что они спроектированы интуитивно понятными и простыми в использовании. Например, для запуска потока необходимо вызвать метод Start из класса Thread. Чтобы сделать недоступным объект TextBox, свойству Enabled этого объекта присваивается значение false. Такой подход, хорошо знакомый разработчикам Visual Basic 6 и Java, чьи библиотеки использовать столь же легко, принесёт огромное облегчение разработчикам С++, которым в течение многих лет приходилось «воевать» с такими API-функциями, как GetDIBits, RegisterWndClassEx и IsEqualIID, а также с множеством функций, которые требовали передачи дескрипторов окон.

Однако разработчики на С++ всегда имели легкий доступ к полному набору Windows API, в то время как разработчики на Visual Basic 6 и Java были ограничены в использовании базовой функциональности операционной системы, доступ к которой они получали из своих языков. Что касается базовых классов .NET, то они комбинируют простоту использования, присущую библиотекам Visual Basic и Java, с относительно полным покрытием набора функций Windows API. Многие средства Windows не доступны через базовые классы, и в этих случаях придется обращаться к API-функциям, но, в общем, это касается лишь наиболее экзотических функций. Для каждодневного применения набора базовых классов, в основном, будет достаточно. Но если понадобится вызвать API-функцию, то для этого .NET предоставляет так называемый механизм вызова платформы (platform-invoke),гарантирующий корректное преобразование типов данных, поэтому теперь эта задача не труднее, чем вызов этих функций непосредственно из кода С++, причем независимо от того, на каком языке пишется код — С#, С++ или Visual Basic 2010.