Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемВалентин Аушев
1 СборкиReflection Лекция 8
2 Сборки Reflection
3 Сборки Reflection
4 Базовая единица.NET – программы Исполняемый файл (*.exe) Динамическая библиотека (*.dll) Функции сборок Содержать и группировать код Единица безопасности Определяют границы типов ( инкапсуляция ) Имеют цифровую подпись ( защита от подделок ) Единица развертывания Возможна замена отдельных сборок при обновлении приложения Единица версий Сборки отличающиеся только версией могут сосуществовать на одном компьютере Сборки полностью себя описывают
5 Windows заголовок CLR заголовок Манифест Файлы сборки ( один или несколько ) Требуемые сборки Метаданные сборки Список внешних ресурсов Метаданные типов Исполняемый IL код Ресурсы
6 Анализ сборки Установка ссылки на сборку Использование сборок на разных языках сборки
7 Простое имя Совпадает с именем файла без расширения Сильное имя (strong name) Имя Версия Культура Открытый ключ (+ цифровая подпись ) Сильные имена уникальны
8 Локально в каталоге приложения в подкаталоге с именем сборки в специально настроенном подкаталоге могут храниться любые сборки ( с сильными и простыми именами ) могут использоваться только этим приложением В глобальном кэше сборок (GAC, Global Assembly Cache) Только сборки со строгими именами Только библиотечные сборки (.dll) Могут использоваться разными программами Для установки требуются администраторские права
9 Сильное имя ? Нет : Ищется.dll в текущей папке Ищется.exe в текущей папке Поиск.dll в подпапке с именем сборки Поиск.exe в подпапке с именем сборки Да : Ищется в GAC Если в GAC нет, то ищется локально
10 Нет конфликта версий (DLL Hell) Сборки с разными именами могут существовать совместно Совместное использование Меньше расход дискового пространства Безопасность Цифровая подпись Защита от подделки кода или сборки Проверка изготовителя сборки
11 Подписывание сборки Генерация пары открытого и закрытого ключа Утилита генерации пары ключей sn.exe sn –k имя _ файла.snk Выбор файла с ключами в Visual Studio в разделе свойств проекта, подписывание Оба шага можно выполнить в Visual Studio в разделе свойств проекта, подписывание Установка версии сборки Атрибут assembly: AssemblyVersion в файле свойств сборки AssemblyInfo.cs Для автоматического увеличения номера версии сборки при компиляции можно задать [assembly: AssemblyVersion("1.0.*")] Задание необходимых полей для описания сборки. Издатель и т. д. В файле AssemblyInfo.cs или в свойствах проекта -> Application- > Assembly Information Application- > Assembly Information">
12 Задание сильного имени сборке
13 Утилита gacutil.exe Установка сборки в GAC gacutil /i Имя _ сборки Удаление сборки из GAC gacutil /u Имя _ сборки Необходимы права администратора и привилегии администратора в UAC GAC расположен в ( скрытой ) папке c:\Windows\assembly\
14 Установка в GAC ( возможна, только если есть права администратора )
15 Сборки Reflection
16 Хранится в сборке В виде метаданных Может быть извлечена ildasm.exe программно Reflection - получение информации о типах во время выполнения Пространство имен System.Reflection Получение метаданных в виде объектной модели Получение информации о типах, методах, свойствах, полях типа, параметров методов и т. д. Динамическое управление загрузкой модулей Динамическое создание экземпляров типов Доступ к членам по именам Вызов методов на лету, не зная о них в момент выполнения
17 Assembly - представляет сборку Type - представляет тип MemberInfo – представляет любой член типа ConstructorInfo – представляет конструктор MethodInfo – представляет метод ParameterInfo – представляет параметр FieldInfo – представляет поле PropertyInfo – представляет свойство EventInfo – представляет событие
18 Автоматическая Загружает CLR В манифесте указана ссылка на сборку ( добавляется при указании ссылки в проекте ) Данные о сборке задаются на этапе разработки При отсутствии сборки – Exception при старте программы Динамическая Самостоятельная загрузка сборки Программа не содержит явных ссылок на загружаемую сборку Данные о сборке формируются в процессе работы программы Возможна мягкая обработка отсутствия сборки Программа и CLR при старте ничего не знает об динамически - загружаемой сборке
19 Динамическая загрузка сборки ( статические методы ) Assembly.Load Assembly.Load( Имя сборки); Assembly asm = Assembly.Load(Complex); Assembly asm = Assembly.Load(Complex, Version= , PublicKeyToken=null, Culture=); Assembly asm = Assembly.Load ("SampleAssembly, Version= , Culture=neutral, PublicKeyToken=8744b20f8da049e3"); Assembly.Load Assembly.Load(AssemblyName assemblyRef) AssemblyName – представляет собой класс для удобного построения сильного имени сборки Assembly.LoadFile Assembly.LoadFile( Полное _ имя _ файла ) Assembly asm = Assembly.LoadFile(c:\Complex.dll) Assembly.ReflectionOnlyLoad Assembly.ReflectionOnlyLoad( Имя сборки); - загрузка только для анализа метаданных. Запрещено создавать типы и исполнять код Сборки выгружаются только при закрытии домена приложения ( автоматически ) Важные методы и свойства : FullName Свойство FullName - Полное имя сборки : GetTypes Type[] GetTypes() – получение описания всех типов в сборке GetType Type GetType("ComplexClass.Complex"); - получение описания конкретного типа
20 Описание типа Получение : typeof (float), typeof (MyClass) obj.GetType() Type.GetType( полное _ имя _ типа) assembly.GetType(Complex) Методы ( экземпляра ) GetConstructors ConstructorInfo[] ci = t.GetConstructors() – возвращает описания конструкторов GetMembers MemberInfo[] mi = t.GetMembers(); – возвращает описания членов GetMethods MethodInfo[] mi = t.GetMethods(); – возвращает описания методов GetProperties PropertyInfo[] pi = t.GetProperties(); – возвращает описания свойств GetFields FieldInfo[] fi = t.GetFields(); – возвращает описания полей GetEvents EventInfo[] fi = t.GetEvents(); – возвращает описания событий И т. д. Получение конкретного члена – без -s и с указанием имени члена FieldInfo mi = t.GetField("Real"); FindMembers MemberInfo[] mi = t.FindMembers() – поиск членов по критериям Свойства : Name, Namespace Name, Namespace IsAbstract, IsPublic, IsNotPublicIsClass, IsArray, IsInterface, IsGenericType, IsNested, IsSealed, IsPrimitive, IsVisible IsAbstract, IsPublic, IsNotPublicIsClass, IsArray, IsInterface, IsGenericType, IsNested, IsSealed, IsPrimitive, IsVisible
21 MemberInfoMemberInfo TypeTypeEventInfoEventInfoFieldInfoFieldInfoPropertyInfoPropertyInfoMethodBaseMethodBase MethodInfoMethodInfoConstructorInfoConstructorInfo
22 Базовый класс для описание членов типа Свойства Name string Name – имя члена DeclaringType Type DeclaringType – объявляющий тип ReflectedType Type ReflectedType – тип, через который получен доступ ( может быть типом наследником ) MemberType MemberTypes MemberType – тип члена. Перечисление Method, Constructor, Event и. т. д.
23 Описание для полей и констант Получение статической информации FieldType Свойство Type FieldType - Тип поля Name Name – имя поля IsPublicIsPrivate IsPublic, IsPrivate, … - доступ IsInitOnly IsInitOnly - поле объявлено как readonly) IsStatic IsStatic - статичность поля И т. д. Работа со значениями на объектах GetValue object GetValue(object o) – получение значения свойства у экземпляра типа SetValue void SetValue(object obj, object value) – установка значения свойства для экземпляра типа
24 Базовый класс для : ConstructorInfo MethodInfo Информация о доступности и т. д. Name – имя метода Name – имя метода IsPublicIsPrivate IsPublic, IsPrivate, … - доступ IsStatic IsStatic - статичность метода IsVirtual, IsAbstract, IsFilnal IsVirtual, IsAbstract, IsFilnal – виртуальный, абстрактный или не переопределяемый метод IsConstructor IsConstructor – конструктор И. т. д. Информация о параметрах ParameterInfoGetParameters ParameterInfo[] GetParameters() – получение информации о входных параметрах ParameterInfo Тип ParameterInfo Name Name – имя параметра IsIn IsOut IsIn / IsOut – входной / выходной параметр IsRetval IsRetval – возвращаемый параметр ParameterType ParameterType – тип параметра
25 ConstructorInfo - наследник от MethodBase ConstructorName ConstructorName – имя метода конструктора класса TypeConstructorName TypeConstructorName – имя типа конструктора класса MethodInfo - наследник от MethodBase ReturnType Type ReturnType - Тип возвращаемого значения ReturnParameter ParameterInfo ReturnParameter – ParameterInfo возвращаемого параметра
26 Получение метаданных сборки
27 Activator.CreateInstance() Динамическое создание типа Activator.CreateInstance() Activator.CreateInstance object o = Activator.CreateInstance( Тип, параметры конструктора ); Type type = myAssembly.GetType("ComplexNameSpace.Complex"); object o = Activator.CreateInstance(type, 5, 7);
28 Динамический вызов метода Invokeobject obj methodInfo.Invoke(object obj, object [] parameters); MethodInfo mi = myType.GetMethod("ToString"); object retValue = mi.Invoke(o, null); Динамический вызов статического метода Invokenull methodInfo.Invoke(null, object [] parameters); Динамический вызов переопределенной операции – как вызов метода op_Addition MethodInfo miadd = type.GetMethod("op_Addition"); object o3 = miadd.Invoke(null, new object[] { o1, o2 });
29 Работа с полями и свойствами GetValue object GetValue(object o) – получение значения свойства у экземпляра типа SetValue void SetValue(object obj, object value) – установка значения свойства для экземпляра типа Работа с событиями EventInfo ei = type.GetEvent("MyEvent"); AddEventHandler ei.AddEventHandler(obj, myDelegate); RemoveEventHandler ei. RemoveEventHandler(obj, myDelegate);
30 Динамическое создание типа и вызов его методов
31 Dynamic Runtime Language (DLR) Перенос проверки типов и наличие членов типа с момента компиляции в момент времени выполнения dynamic Ключевое слово dynamic myAssembly.GetType("ComplexNameSpace.Complex"); dynamic d = Activator.CreateInstance(type, 5, 7); d.Print(); Console.WriteLine(d + d * d.Re); Удобно работать с Reflection, WinAPI, COM объектами и т. д. Удобно работать с динамическими языками программирования Есть примеры, которые возможны только при использовании dynamic Возможны ошибки в Runtime, а не в момент компиляции Тяжело отлаживать При разработке нет подсказок IntelliSence Загружаются доп. Сборки (DLR) Чуть медленнее Появилось в.NET 4
32 dynamic
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.