Сборки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