СборкиReflection Лекция 8. Сборки Reflection Сборки Reflection.

Презентация:



Advertisements
Похожие презентации
Версия сборки Номер версии сборки имеет формат major.minor.build.revision. Например, Значения major(старший), minor(младший), build (компоновка)
Advertisements

Отражение (reflection) Отражение – получение из метаданных информации о типах, определенных в сборке. Классы, поддерживающие механизм отражения, находятся.
ФИЛОСОФИЯ.NET Любому современному программисту, который желает идти в ногу с последними веяниями, каждые несколько лет приходится переучиваться.
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Лекция 2: Описание класса 1. Поля 2. Методы 3. Конструкторы.
АтрибутыСериализация Лекция 10. Атрибуты Сериализация.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Проф. В.К.Толстых, Технологии разработки Internet- приложений ASP.NET приложения – Модули HTTP, фильтры, события приложения - Global.asax.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
1 © Luxoft Training 2013 Модуль 7 Введение Исследование классов 7-1 Механизм Reflection.
Учебный курс Технологии и средства разработки корпоративных систем Лекция 10 Компонентные и офисные приложения на платформе Microsoft Лекции читает кандидат.
Модуль 3: Настройка и установка сборок. Обзор Работа с сборками Обеспечение доступа к сборкам, GAC Установка сборок с помощью Installation Types Настройка.
Высокоуровневые методы информатики и программирования Лекция 10 События.
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
Алексей Игнатенко. Независимый программный модуль, обычно подключаемый на этапе выполнения программы.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Транксрипт:

СборкиReflection Лекция 8

Сборки Reflection

Сборки Reflection

Базовая единица.NET – программы Исполняемый файл (*.exe) Динамическая библиотека (*.dll) Функции сборок Содержать и группировать код Единица безопасности Определяют границы типов ( инкапсуляция ) Имеют цифровую подпись ( защита от подделок ) Единица развертывания Возможна замена отдельных сборок при обновлении приложения Единица версий Сборки отличающиеся только версией могут сосуществовать на одном компьютере Сборки полностью себя описывают

Windows заголовок CLR заголовок Манифест Файлы сборки ( один или несколько ) Требуемые сборки Метаданные сборки Список внешних ресурсов Метаданные типов Исполняемый IL код Ресурсы

Анализ сборки Установка ссылки на сборку Использование сборок на разных языках сборки

Простое имя Совпадает с именем файла без расширения Сильное имя (strong name) Имя Версия Культура Открытый ключ (+ цифровая подпись ) Сильные имена уникальны

Локально в каталоге приложения в подкаталоге с именем сборки в специально настроенном подкаталоге могут храниться любые сборки ( с сильными и простыми именами ) могут использоваться только этим приложением В глобальном кэше сборок (GAC, Global Assembly Cache) Только сборки со строгими именами Только библиотечные сборки (.dll) Могут использоваться разными программами Для установки требуются администраторские права

Сильное имя ? Нет : Ищется.dll в текущей папке Ищется.exe в текущей папке Поиск.dll в подпапке с именем сборки Поиск.exe в подпапке с именем сборки Да : Ищется в GAC Если в GAC нет, то ищется локально

Нет конфликта версий (DLL Hell) Сборки с разными именами могут существовать совместно Совместное использование Меньше расход дискового пространства Безопасность Цифровая подпись Защита от подделки кода или сборки Проверка изготовителя сборки

Подписывание сборки Генерация пары открытого и закрытого ключа Утилита генерации пары ключей sn.exe sn –k имя _ файла.snk Выбор файла с ключами в Visual Studio в разделе свойств проекта, подписывание Оба шага можно выполнить в Visual Studio в разделе свойств проекта, подписывание Установка версии сборки Атрибут assembly: AssemblyVersion в файле свойств сборки AssemblyInfo.cs Для автоматического увеличения номера версии сборки при компиляции можно задать [assembly: AssemblyVersion("1.0.*")] Задание необходимых полей для описания сборки. Издатель и т. д. В файле AssemblyInfo.cs или в свойствах проекта -> Application- > Assembly Information

Задание сильного имени сборке

Утилита gacutil.exe Установка сборки в GAC gacutil /i Имя _ сборки Удаление сборки из GAC gacutil /u Имя _ сборки Необходимы права администратора и привилегии администратора в UAC GAC расположен в ( скрытой ) папке c:\Windows\assembly\

Установка в GAC ( возможна, только если есть права администратора )

Сборки Reflection

Хранится в сборке В виде метаданных Может быть извлечена ildasm.exe программно Reflection - получение информации о типах во время выполнения Пространство имен System.Reflection Получение метаданных в виде объектной модели Получение информации о типах, методах, свойствах, полях типа, параметров методов и т. д. Динамическое управление загрузкой модулей Динамическое создание экземпляров типов Доступ к членам по именам Вызов методов на лету, не зная о них в момент выполнения

Assembly - представляет сборку Type - представляет тип MemberInfo – представляет любой член типа ConstructorInfo – представляет конструктор MethodInfo – представляет метод ParameterInfo – представляет параметр FieldInfo – представляет поле PropertyInfo – представляет свойство EventInfo – представляет событие

Автоматическая Загружает CLR В манифесте указана ссылка на сборку ( добавляется при указании ссылки в проекте ) Данные о сборке задаются на этапе разработки При отсутствии сборки – Exception при старте программы Динамическая Самостоятельная загрузка сборки Программа не содержит явных ссылок на загружаемую сборку Данные о сборке формируются в процессе работы программы Возможна мягкая обработка отсутствия сборки Программа и CLR при старте ничего не знает об динамически - загружаемой сборке

Динамическая загрузка сборки ( статические методы ) 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"); - получение описания конкретного типа

Описание типа Получение : 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

MemberInfoMemberInfo TypeTypeEventInfoEventInfoFieldInfoFieldInfoPropertyInfoPropertyInfoMethodBaseMethodBase MethodInfoMethodInfoConstructorInfoConstructorInfo

Базовый класс для описание членов типа Свойства Name string Name – имя члена DeclaringType Type DeclaringType – объявляющий тип ReflectedType Type ReflectedType – тип, через который получен доступ ( может быть типом наследником ) MemberType MemberTypes MemberType – тип члена. Перечисление Method, Constructor, Event и. т. д.

Описание для полей и констант Получение статической информации 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) – установка значения свойства для экземпляра типа

Базовый класс для : 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 – тип параметра

ConstructorInfo - наследник от MethodBase ConstructorName ConstructorName – имя метода конструктора класса TypeConstructorName TypeConstructorName – имя типа конструктора класса MethodInfo - наследник от MethodBase ReturnType Type ReturnType - Тип возвращаемого значения ReturnParameter ParameterInfo ReturnParameter – ParameterInfo возвращаемого параметра

Получение метаданных сборки

Activator.CreateInstance() Динамическое создание типа Activator.CreateInstance() Activator.CreateInstance object o = Activator.CreateInstance( Тип, параметры конструктора ); Type type = myAssembly.GetType("ComplexNameSpace.Complex"); object o = Activator.CreateInstance(type, 5, 7);

Динамический вызов метода 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 });

Работа с полями и свойствами 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);

Динамическое создание типа и вызов его методов

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

dynamic