|
Программирование >> Программирование с использованием ajax
namespace FindAttributes { class Program { / <summary> / Главная точка входа .ехе / </summary> / Аргументы командной строки < param name= args > - имя сборки < /рагат > static void Main(string[] args) Информация об использовании выходных данных, если это необходимо, if (args.Length == 0) Usage О; else if ( (args.Length ==!)&& (args[0] == /? )) Usage 0; else { Циклический просмотр аргументов, переданных консольному приложению. Это сделано, поскольку при указании полного имени пути, содержащего пробелы, это приведет к генерированию нескольких аргументов - они всего лишь снова объединяются в одно имя файла. . . StringBuilder sb = null; for (int pos = 0; pos < args. Length; pos++) { if (null == sb) sb = new StringBuilder(args[pos]); else sb.AppendFormat ( {0} , args[pos]); string assemblyName = sb.ToString (); Попытка загрузки указанной сборки. Assembly а = Assembly.LoadFrom(assemblyName); Выяснение атрибутов, определенных в сборке. Параметр игнорируется, поэтому я выбрал значение true. object[] attributes = a.GetCustomAttributes(true); Если какие-то атрибуты были определены. . . if (attributes.Length > 0) Console.WriteLine( Assembly attributes for {0}... , assemblyName); Console.WriteLine( Атрибуты сборки для {0}... , assemblyName); Их следует выгрузить... foreach (object о in attributes) Console.WriteLine ( {0} , о.ToString ()); else Console.WriteLine( Assembly {0} contains no Attributes. , assemblyName); Console.WriteLine( Сборка {0} не содержит атрибутов. , assemblyName); catch (Exception ex) { Console.WriteLine ( Exception thrown loading assembly {0}.. assemblyName); Console.WriteLine( Исключение при загрузке сборки {0}.. assemblyName); Console.WriteLine О; Console.WriteLine(ex.ToString()) ; / <summary> / Отображение информации по использованию .ехе. / </summary> static void Usage () { Console.WriteLine( Usage: ); Console.WriteLine( FindAttributes <Assembly> ); Console.WriteLine( Использование: ); Console.WriteLine( FindAttributes <Сборка> ); Чтобы запустить приложение FindAttributes, необходимо указать имя сборки, которую нужно исследовать. Пока можно использовать саму сборку FindAttributes. ехе, показанную на рис. 30.3. I Vi$u*l Studto 2008 BrtB 2 Command Prompt Ihtit- \bin\l>f>Hi4>FinHftttr ftttrlhiii*- It ll ftttrihiitr rriptioiifttf rihiite опГ iqiip.tl ionfttt r i hiiti; oiiMiiyAttrih it> rnriiiitfttlrihut. iiliyriqht nrtrilNit . r<td РкйГ trllNitr- f iinUi ihlrftttpihiitr e. .GuiflftttPibtit. 1 i-U>-p 1011Й1 r I-1 h i Ipntt rilMiti irf.: .Conpi lat lOiiH- l.iKAt in ice-. .Runt If Cuiipatihi lit <; Puc. 30.3. Запуск приложения FindAttributes для сборки FindAttributes. ехе Код примера вначале проверяет параметры, переданные в командной строке - при отсутствии таких параметров, или если пользователь вводит строку FindAttributes /?, код вызывает метод Usage (). Этот метод отображает краткую простую справку по использованию: if (args.Length == 0) Usage () ; else if ( (args .Length ==1) & & (args[0] == /? )) Usage (); Затем код преобразует аргументы командной строки в единую строку. Это связано с тем, что имена каталогов часто содержат пробелы, подобно каталогу Program Files, в результате чего имя воспринимается как два аргумента. Поэтому код циклически просматривает все аргументы, объединяя их в одну строку, которая используется в качестве имени сборки, предназначенной для загрузки: StringBuilder sb = null; for (int pos = 0; pos < args.Length; pos++) { if (null == sb) sb = new StringBuilder(args[pos]); else sb.AppendFormat ( {0} , args[pos]); string assemblyName = sb.ToString (); Затем код предпринимает попытку загрузки сборки и получения с помощью метода GetCustomAttributes () всех определенных в ней пользовательских атрибутов: Assembly а = Assembly.LoadFrom (assemblyName); Выяснение атрибутов, определенных в сборке, object[] attributes = a.GetCustomAttributes(true); Любые найденные атрибуты выводятся на консоль. Применение программы к файлу FindAttributes.exe привело к отображению атрибута DebuggableAttribute. Хотя он и не был указан, компилятор С# добавил его и, как легко убедиться, любые исполняемые файлы, скомпонованные для отладки, содержат этот атрибут. Чтобы просмотреть атрибуты данной сборки, необходимо либо запустить пример из командной строки, либо изменить параметры командной строки, добавив в их число сборку, которую нужно исследовать. Позднее в этой главе мы вернемся к теме рефлексии, чтобы выяснить, как можно получить атрибуты классов и методов, определенных внутри сборки. Встроенные атрибуты В предшествующих разделах было показано, что каркас .NET Framework включает в себя ряд атрибутов, таких как DebuggableAttribute и AssemblyTitleAttribute. Данный раздел посвящен некоторым часто применяемым атрибутам, определенным в .NET Framework, и ситуациям, в которых может требоваться их использование. В этом разделе освещены следующие атрибуты: □ System.Diagnostics.ConditionalAttribute а System.ObsoleteAttribute □ System.SerializableAttribute □ System.Reflection.AssemblyDelaySignAttribute Более подробную информацию о других атрибутах, поставляемых с .NET Framework, можно найти в документации по .NET Framework SDK. Еще один чрезвычайно полезный инструмент для работы с каркасом .NET - программа Reflector, которую можно загрузить с сайта www. aisto. com/roeder/dotnet. Это программное средство позволяет исследовать сборки и просматривать все типы, определенные внутри них. Его можно использовать, чтобы с помощью всего несколь-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |