* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Поиск пространства имен
15 апреля 2009
В модуле могут объявляться (подключаться) другие модули, от которых этот модуль зависит. Как и для платформы Win32, компилятор Delphi 8 для .NET должен иденти- фицировать эти модули. В случае с явным объявлением имен путь всегда известен, но если это групповой модуль, то компилятор должен определить область поиска подклю- ченных модулей. Рассмотрим следующий пример модуля с явным объявлением про- странства имен и подключенными модулями (для чего используется директива uses). unit MyCompany.Programs.Units.MyUnitl; uses MyCompany.Libs.Unit2, Unit3, Unit4; Здесь модуль MyUnitl является членом пространства имен MyCompany. Programs .Units. Модуль MyUnitl зависит от трех других модулей: модуля Unit2 в пространстве имен MyCompany.Libs и двух групповых модулей Unit3 и Unit4.
Компилятор может легко установить полное имя модуля Unit2, но для нахожде- ния полных имен модулей Unit3 и Unit4 компилятор должен произвести поиск сре- ди соответствующих пространств имен. Для поиска используются источники: опции компилятора, объявленные в файле проекта пространства имен, пространства имен по умолчанию и, наконец, текущее пространство имен для данного модуля. В файле проекта можно дополнительно определить список пространства имен по- иска для групповых модулей. Объявление пространства имен должно происходить сразу после объявления программы, библиотеки или пакета и перед всеми другими конструкциями или блоками. Пространства имен в списке разделяются запятыми и список должен заканчиваться точкой с запятой. Компилятор будет производить поиск в следующем порядке: • текущее пространство имен модуля; • пространство имен по умолчанию; • список пространства имен проекта; • пространства имен, указанные в опциях компилятора. Ниже приведен пример файла проекта и модуля с объявлением списка про- странств имен для поиска файла. // Файл проекта. program MyCompany.Programs.MyProgram; namespaces MyCompany.Libs.UlWidgets, MyCompany.Libs.Network; // Файл модуля. unit MyCompany.Programs.Units.MyUnitl; Используя эти объявления, компилятор будет производить поиск в следующем порядке: • MyCompany.Programs.Units; • MyCompany.Programs; • MyCompany.Libs.Network; • MyCompany.Libs.UlWidgets; • Пространство имен, указанное в опциях компилятора. Если модуль является групповым (т.е. не имеет явно объявленного пространства имен), то поиск начинается с пространства имен по умолчанию. Подключение модулей можно производить как с полностью указанным пространством имен, так и с указанием только группового имени, при этом удостоверившись, что компилятор сможет найти модуль. В примере ниже показано, как можно подключить модули. unit MyCompany.Libs.MyUni11 uses MyCompany.Libs.Unit2, // Полностью указанное имя. UnitX; // Групповое имя. При этом в программе можно обращаться к элементам модуля как по полному имени, так непосредственно по имени элемента. uses MyCompany.Libs.Unit2; begin writeln(MyCompany.Libs.Unit2.SomeString); writeln(SomeString); end. При использовании полного имени необходимо включать имя целиком. writeln(Unit2.SomeString); // Ошибка! writeln(Libs.Unit2.SomeString); // Ошибка! writeln(MyCompany.Libs.Unit2.SomeString); // Правильно. writeln(SomeString); // Правильно. Ссылка только на часть пространства имен при подключении модулей также будет ошибкой. uses MyCompany; // Ошибка! Чтобы не набирать очень длинные имена, можно объявлять псевдонимы и исполь- зовать их локально в модуле. Сделать это можно так. uses MyCompany.AVeryLongNamespaceDesignation.VeryDescriptiveUnitName as aUnit; После чего на имя можно ссылаться с помощью псевдонима. Ниже приведены два эквивалентных утверждения. writeln(aUnit.SomeString); writeln(MyCoirpany.AVeryLongNamespaceDesignation.VeryDescriptiveUnitName.SomeString); Как получить информацию Мы рассмотрим различные возможности платформы .NET с использованием про- странства имен и содержащихся в них типов, но в одной книге невозможно описать все пространства имен. Необходимо уметь находить информацию о нужных типах и простран- ствах имен самостоятельно. Удобнее всего использовать для этого утилиту ildasm.exe, о которой уже упоминалось выше, хотя есть и другие средства получения необходимых сведений. Например, с .NET SDK поставляются утилиты ildasm, classview И wincv. Дизассемблер ildasm.exe Официальное название ildasm.exe можно перевести как "утилита дизассембли- рования промежуточного языка". В дальнейшем будем ее называть просто "дизассемблером". Эта утилита позволяет просмотреть содержимое любой сборки .NET (файла с расширением . d l l или .ехе). Можно изучить манифест, метаданные типов и инструкции IL. При этом все операции производятся с использованием дру- жественного графического интерфейса. Просто запустите ildasm.exe и с помощью команды меню File^Open откройте нужную сборку. Ранее эта утилита уже использо- валась для просмотра сборки Sum (см. рис. 2.2 и 2.3). Как видно, структура сборки представлена в самом обычном формате с деревом и узлами. Каждый метод, свойство, вложенный класс, как и все остальные типы, представлены специальными значками (в текстовом дампе дизассемблера эти значки будут заменены на аббревиатуры, состоящие из трех символов). Помимо просмотра информации о типах и их членах, ildasm позволяет получать сведения о командах IL, относящихся к выбранному типу. Дизассемблер ildasm обладает замечательной возможностью выгружать иерархию исследуемой сборки в текстовый файл, после чего полученный дамп можно изучать в удобной обстановке. Чтобы создать текстовый дамп, откройте нужную сборку, в ме- ню File выберите команду Dump TreeView и укажите имя для создаваемого текстового файла. Обратите внимание, что графические значки будут заменены соответствующи- ми текстовыми аббревиатурами. В файл можно выгружать не только типы и члены типов исследуемой вами сборки, но и относящийся к объектам сборки код IL. Для этого в ildasm предна- значена другая команда: FileoDump. По умолчанию для дампов с инструкциями IL используется расширение * . h. В дизассемблере ildasm есть еще одна удобная возможность. С помощью ildasm можно просматривать метаданные типов, т.е. ту информацию о типах сборки, кото- рую генерирует компилятор для среды исполнения .NET. Для просмотра метаданных типов достаточно загрузить сборку в ildasm и нажать клавиши <Ctrl+M>.