|
Программирование >> Программирование с использованием ajax
По завершении компиляции щелкните правой кнопкой мыши на сборке (которую можно найти в каталоге \bin\Debug проекта) в окне проводника Windows и в контекстном меню выберите опцию Properties (Свойства). Вкладка Details (Подробно) окна свойств в среде Windows Vista показана на рис. 30.2. Поле File Description (Описание файла) содержит описание, хранящееся в атрибуте AssemblyTitle. 01 AttnbutePeelLcj* Properties
FWve ProoerttCT and Perwnai котмЬог, Рис. 30.2. Вкладка Details Атрибуты сборок и соответствующие им имена свойств на вкладке Details приведены в табл. 30.1. Таблица 30.1. Атрибуты сборок и имена свойств на вкладке Details
Возможно, вы обратили внимание, что список атрибутов, доступных на странице свойств сборки, короче списка атрибутов, определенных внутри сборки - одним из таких примеров служит атрибут AssemblyConf iguration. Компания Microsoft отобразила некоторые из наиболее часто используемых атрибутов на странице свойств Details, но чтобы обратиться к другим атрибутам, придется либо создать определенный код (как показано в разделе Рефлексия ), либо использовать lldasm или утилиту Reflector. Чтобы выяснить все атрибуты данной сборки, можно применить lldasm для исследования сборки и нахождения определенных в ней атрибутов. Чтобы добавить ILDASM в качестве инструмента, используемого внутри Visual Studio 2008, вызовите опцию External Tools (Внешние инструменты) меню Tools (Сервис), щелкните на кнопке Add (Добавить), а затем установите ILDASM в качестве заголовка и C:\Program Files\ Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe в качестве исполняемой команды. После того, как этот инструмент добавлен в меню инструментальных средств, можно открыть программу Ildasm и выбрать нужную сборку с помощью диалогового окна File Open (Открытие файла). Двойной щелчок на выделенном разделе MANIFEST (Манифест) ведет к открытию второго окна, содержащего манифест сборки. Прокрутив содержимое файла, вы обнаружите ряд странно выглядящих строк кода - это код на промежуточном языке (Intermediate Language - IL), созданный компилятором С#: .assembly AttributePeek .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.сtor(string) = ( 01 00 15 41 74 74 72 69 62 75 74 65 50 65 65 6B ...AttributePeek 20 2D 20 62 79 20 4D 45 00 00 ) - by ME. . .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 20 43 6F 70 79 72 69 67 68 74 20 02 A9 20 . . Copyriglit .. 4D 6F 72 67 61 6E 20 53 6B 69 6E 6E 65 72 20 32 Morgan Skinner 2 30 30 37 00 00 ) 007. . .liash algorithm 0x00008004 .ver 1:0:0:0 Просматривая файл, вы обратите внимание на ряд объявлений, напоминающих объявления типа: [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 15 41 74 74 72 69 62 75 74 65 50 65 65 63 ...AttributePeek Введенный атрибут AssemblyTitle сохраняется в манифесте сборки - если применить таблицу преобразования шестнадцатеричных значений в ASCII, легко убедиться, что символы, следующие за 01 00 15, представляют ASCII-коды текста AttributePeek. Просто для информации, скажу, что первые два байта 01 00 представляют двухбайтовый идентификатор, а 15 - длину строки (21 символ). Последнее значение может быть двухбайтовым, если длина данных превышает 256 символов. Как уже было сказано, этот процесс сохранения атрибута внутри сборки называют декапированием, с которым можно ознакомиться, просматривая теоретические материалы по .NET, доступные в Web. Обратите внимание, что в приведенном фрагменте кода из файла Assemblyinf о. cs использован член AssemblyTitle, в то время как в приведенном коде IL он представлен как AssemblyTitleAttribute. Вначале компилятор С# ищет класс атрибута AssemblyTitle и, не найдя его, затем добавляет слово Attribute и повторяет поиск. Поэтому, как бы ни было введено имя класса - полностью или без суффикса Attribute - в результате будет сгенерирован один и тот же код. В примерах этой главы суффикс Attribute опущен. Объявление атрибута, сохраненное (декапированное) в манифесте, подозрительно напоминается объект и его конструктор. Байты, заключенные в скобки - параметры, переданные конструктору. Теперь, когда вам знакомы теоретические основы, должно быть понятно следующее определение атрибута. Атрибут - это класс, который внутри сборки может содержать дополнительные данные, касающиеся сборки или любого типа внутри нее. Учитывая, что атрибут является классом, и что в манифесте атрибут хранится в вышеприведенном формате, снова рассмотрим определение атрибута, показанное в начале главы: [assembly: AssemblyTitle( AttributePeek - by ME )] Синтаксис этой строки несколько отличается от обычного синтаксиса С#, поскольку атрибут заключен в квадратные скобки. Дескриптор assembly; определяет область действия атрибута (которая освещена далее в этой главе), а остальная часть кода объявляет атрибут. Атрибут AssemblyTitle обладает конструктором, который принимает только один аргумент - строковое значение. Компилятор включает это значение в сборку. Доступ к этому значению можно получить через стандартную страницу Properties (Свойства) проводника Windows, просматривая сборку внутри lldasm, или программно с помощью рефлексии, которая рассматривается в следующем разделе. Кроме простых атрибутов, связанных с информацией о сборке, каркас .NET Framework определяет несколько сотен атрибутов, используемых для выполнения таких разнообразных задач, как отладка, управление поведением элемента управления во время разработки и множества других. В последующих разделах вы ознакомитесь с некоторыми из стандартных атрибутов, а затем научитесь дополнять каркас .NET собственными пользовательскими атрибутами. Рефлексия Если вы не знакомы с основами языка Java, вероятно, понятие рефлексии является для вас новым, поэтому было решено посвятить несколько страниц ее определению и возможному использованию. Рефлексия позволяет программно исследовать сборку и получать информацию о ней, в том числе информацию обо всех содержащихся в ней типах объектов. Эта информация охватывает атрибуты, добавленные к этим типам. Классы рефлексии определены внутри пространства имен System. Ref lection. Кроме считывания типов, определенных внутри данной сборки, посредством служб System. Ref lection. Emit или System. CodeDom можно также генерировать (порождать) собственные сборки и типы. Эта тема несколько сложна для книги по основам С#, но те, кого она интересует, могут найти информацию по порождению динамических сборок в MSDN. Первый пример этого раздела посвящен исследованию сборки и отображению списка всех определенных в ней атрибутов - в результате должен отобразиться список, подобный приведенному ранее. В этой главе формату примеров кода уделено несколько меньше внимания, поскольку к настоящему моменту читатели должны уже достаточно хорошо осознавать выполняемые ими действия! Весь код можно найти в папке загружаемого кода для главы 30. Некоторые примеры этой главы содержат лишь наиболее важные фрагменты кода, поэтому для получения полного представления о нем обязательно просмотрите весь загружаемый код. Код первого примера можно найти в каталоге Chapter30\02 FindAttributes. Ниже приведено полное содержимое исходного файла: Импорт типов из сборок System и System.Reflection using System; using System.Reflection;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |