Модуль 17 Сборки. Обзор модуля В этом модуле
Модуль 17 Сборки
Обзор модуля В этом модуле вы изучите Сборки Приватные или разделяемые сборки Отражение (Reflection)
Занятие 1 - Сборки На первом занятии, Сборки, вы изучите: Определение динамически подключаемых библиотек (Dynamic Link Libraries, DLL) и их недостатков. Определение и описание сборок. Описание создания сборок с помощью ресурсных файлов. Различия между пространствами имен и сборками.
Динамически подключаемая библиотека (DLL) Это библиотека, содержащая код, который может использоваться несколькими программами одновременно. Некоторые преимущества использования DLL в программе: DLL используют меньше ресурсов. DLL помогают в создании модульных программ. DLL легче переносить и устанавливать.
Недостатки DLL DLL, помимо преимуществ, имеют множество ограничений, при попытках нескольких приложений разделить одну общую DLL. "Ад DLL" (DLL Hell) - это фраза для отражения сложностей, возникающих при работе с динамически подключаемыми библиотеками. Некоторые ограничения DLL: Версионность Размещение и установка Версионность Приложение может установить новую версию разделяемого компонента, несовместимую с версией, уже установленной на машине. Размещение и установка Во время установки приложения, многие программные компоненты копируются на диск, создавая записи в реестре, описывающие компоненты в системе.
Решение для "ада DLL" .NET Framework обеспечивает следующие возможности для решения этой проблемы: Приложения должны быть само-описательны. Информация о версиях должна записываться. При успешном запуске приложения, оно обязано записать связанный набор компонентов и их версии. .NET Framework должна позволять множественным версиям компонента сосуществовать в системе. Приложение должно быть изолировано.
Сборки - это строительные блоки .NET Framework. Они используются для решения проблем версионности и размещения DLL. Сборки - коллекции информации, требуемые во время выполнения для запуске приложения. Два типа сборок в .NET Framework: Приватные (Private) Разделяемые (Shared) Приватные (Private) Закрытая сборка размещается с приложением. Доступна только для приложения. Не может разделяться между другими приложениями. Разделяемые (Shared) Разделяемая сборка размещается в общедоступном месте. Доступна другим приложениям. Что такое сборки?
Свойства Сборки имеют следующие свойства: Реализуются как .exe-файлы или DLL-файлы. Разделяются разными приложениями. Должны иметь сильные имена. Загружаются так и тогда, как и когда это необходимо. Информация может быть получена через механизм отражения. Несколько версий могут использоваться одним приложением. Содержат один или несколько модулей.
Метаданные сборки - Содержат информацию метаданных о сборке, например, информацию о версии. Метаданные типа - Описывают данные в сборке и их типы. Код MSIL - Компиляторы Microsoft .NET преобразовывают исходный код в промежуточный язык, называемый MSIL. Ресурсы - Файлы таких типов, как JPEG, text, XML и так далее, используемые в приложении. Каждая сборка имеет предопределенную структуру. Сборка состоит из следующих четырех частей, называющихся: Метаданные сборки (Assembly Metadata) Метаданные типа (Type Metadata) Код MSIL (MSIL Code) Ресурсы (Resources) Структура
Создание сборки 1-2 Сборки могут создаваться как отдельные файлы .exe или .dll, называемые одиночными сборками. В многофайловых сборках различные элементы сборки содержатся в разных файлах.
Создание сборки 2-2 Одиночная (однофайловая) сборка - есть два метода создания одиночных сборок. К ним относятся: Командная строка Visual Studio Одиночная сборка может быть создана в командной строке с помощью компиляторов командной строки. Итегрированная среда разработки (Integrated Development Environment, IDE) Одиночная сборка может быть создана в Visual Studio 2005. Многофайловая сборка - Шаги по созданию многофайловой сборки в командной строке: Создать исходный код Создать главный исходный файл Ввести команду в приглашение командной строки. Запустить файл Синтаксис csc
Шаги по созданию многофайловой сборки 1-3 Создать исходный код Пример using System; public class Student { public string FullName; public void ShowName() { Console.WriteLine(“Student Full Name: “ + FullName); } } Сохранить код и скомпилировать в модули с помощью команды: csc /t:module modulename.cs Например, csc / t:module Student.cs
Шаги по созданию многофайловой сборки 2-3 Создать главный исходный файл Пример public class MainClass { public static void Main(string[] args) { Student objStudent = new Student(); objStudent.FullName = “Mark Richards”; objStudent.ShowName(); } } В этом примере создается экземпляр класса Student, представленный в файле Student.cs. Метод Main далее вызывает метод ShowName для объекта objStudent класса Student.
Шаги по созданию многофайловой сборки 3-3 Ввести команду в приглашение командной строки: Создаваемые модули могут быть собраны в одиночную сборку с помощью компилятора C#. Для запуска файла, введите его имя DisplayName в командной строке. csc /addmodule:modulename.netmodule /out:outfilename.exe sourcefilename.cs Например, csc /addmodule:Student.netmodule /out:DisplayName.exe MainClass.cs Это генерирует .exe-файл с именем DisplayName.exe.
Ресурсный файл Это коллекция ресурсов, например, изображений, текста и звуков. Вышеуказанные ресурсы могут добавляться к сборкам. Используются, когда пользовательское приложение, разработанное для одной страны, переводится на другой язык. Модифицируются без реального изменения всего приложения. Хранят пары ключ-значение.
Создание ресурсного файла С помощью утилиты Resgen.exe ресурсный файл, который является текстовым, может быть сконвертирован в оригинальный ресурсный файл. Далее ресурсный файл может быть внедрен в сборку или может добавляться внешним файлом. Шаги для создания ресурсного файла: Создать текстовый файл с требуемыми данными и сохранить его на локальной системе. Открыть командную строку Visual Studio 2005. В командной строке необходимо переместиться на диск, где находится.txt-файл. Ввести Resgen filename.txt, где filename - это имя текстового файла.
Использование класса “ResourceWriter” Файлы с изображениями и другими типами могут быть добавлены к библиотеке базовых классов .NET. Этот класс - часть пространства имен System.Resources. Пример static void Main(string[] args) { ResourceWriter objResourceWriter = new ResourceWriter(“Employee.resources”); objResourceWriter.AddResource(“18780”, “James Anderson”); objResourceWriter.AddResource(“22688”, “Ronny Hill”); objResourceWriter.AddResource(“67453”, “Ben Tyler”); objResourceWriter.Generate(); objResourceWriter.Close(); } В примере экземпляр класса ResourceWriter создается в методе Main(). Метод AddResource() может быть далее использован для добавления ресурсов к файлу Employee.resources.
Добавление ресурсного файла Шаги для добавления ресурсного файла в сборку: Откройте Microsoft Visual Studio 2005 IDE. Создайте проект ‘EmployeeDemo’. Для добавления ресурса ‘Employee.resources’ к сборке, щелкните правой кнопкой на имени проекта Class library в Solution Explorer. Щелкните правой кнопкой и выберите пункт меню Add. Щелкните на пункт меню Existing Item. Выберите файл ‘Employee.resources’ в системе и щелкните на Add. Установите свойство Build Action ресурсного файла в Embedded Resource.
Использование ресурсного файла Использование ресурсов Пространство имен System.Reflection должно использоваться для получения ресурсов из файла. Следующий пример возвращает значения ключевых пар, хранящихся в файле. Пример static void Main(string[] args) { Console.WriteLine(“Employees: “); Assembly objAssembly = Assembly.GetExecutingAssembly(); ResourceManager objResourceManage = new ResourceManager(“ResourceDemo.Employee”, objAssembly); Console.WriteLine(objResourceManage.GetString(“10789”)); Console.WriteLine(objResourceManage.GetString(“56786”)); Console.WriteLine(objResourceManage.GetString(“18780”)); Console.WriteLine(objResourceManage.GetString(“22688”)); Console.WriteLine(objResourceManage.GetString(“67453”)); }
Пространства имен и сборки
Занятие 2 - Приватные и разделяемые сборки На втором занятии, Приватные и разделяемые сборки, вы изучите: Определение и описание приватных сборок. Определение и описание разделяемых сборок. Описание размещения сборки в глобальном кэше сборок (Global Assembly Cache, GAC). Объяснение версионности сборок.
Приватные сборки Доступны приложению, для которого они создавались. Создаются, если нет необходимости в сборках другого приложения. Некоторые преимущества приватных сборок: Не требуют регистрации. Более защищенные. Нет ограничений соглашений именования ресурсов.
Размещение приватных сборок Приватная сборка размещается в приложении для эксклюзивного использования этим приложением. Сопровождается манифестом сборки. Устанавливается в папке, содержащей исполняемый файл приложения, или в ее подпапках. Размещается в структуре папок приложения. Некоторые методы, с помощью которых приватные сборки могут размещаться в приложении: После тестирования, сборка может размещаться простым копированием структуры папок на целевую машину с помощью утилиты XCOPY. Также размещение возможно переносом в Проводнике Windows.
“ILDASM.exe” Модуль .NET, содержащий метаданные типов и код промежуточного языка (Intermediate Language, IL). Набор для разработки .NET (Software Development Kit, SDK) предлагает инструмент ILDASM для просмотра содержимого сборок и манифестов. Отображает информацию в удобном для пользователя формате. Выводит информацию о пространствах имен и типах, включая их интерфейсы. Синтаксис
Разделяемые сборки Разделяемые сборки доступны для использования несколькими приложениям. Некоторые преимущества использования разделямых сборок: При разделении сборки код, написанный для определенного приложения, может использоваться другими приложениями. Разделяемая сборка гарантирует отсутствие конфликтов пространств имен в силу использования криптографических ключей. Управление версиями сборок предотвращает несанкционированное добавление или изменение кода посторонними. Разделяемая сборка требует меньше ресурсов, так как вместо загрузки в каждый исполняемый модуль, она загружается только раз, а затем отображается в другие ссылки.
Глобальный кэш сборок Разделяемые сборки хранятся в глобальном кэше сборок (Global Assembly Cache, GAC). Каждая сборка, необходимая для нескольких приложений, хранится в GAC. GAC находится в папке C:WINDOWSassembly в Windows XP, C:WINNTassembly в Windows 2000. Несколько копий сборки могут храниться в GAC с различной версионной информацией. Для установки или удаления разделяемых сборок в GAC может использоваться инструмент gacutil.exe.
Использование сильных имен Сильные имена для сборки могут создаваться и присваиваться специальной утилитой сильных имен (sn.exe).
Подписывание сборки Следующий процесс отражает процедуру подписывания сборки: Сборке X назначается сильное имя. Сборка Y - потребитель сборки X. Манифест сборки Y включает токен, указывающий открытый ключ сборки X. Общая среда выполнения языка (Common Language Runtime, CLR) проверяет сигнатуру сильного имени, когда сборка помещается в GAC. Манифест сборки Y содержит ключ, используемый для генерации сильного имени сборки X. .NET Framework проверяет и гарантирует, что биты сборки X не подменены.
Создание пары ключей Пара открытого/закрытого ключей должна быть создана для подписи сборки с сильным именем. Синтаксис sn –k
Использование строгого имени Инструмент линковки сборки (al.exe) генерирует файл с манифестом сборки от одного или нескольких файлов, которые могут быть модулями или ресурсными файлами. Введите следующую команду в приглашение командной строки: al /out:
Ссылки на сборку Это может быть сделано во время компилирования или выполнения Для реализации ссылки на сборку во время компилирования, введите команду: csc /reference:
Размещение сборки в GAC 1-3 Сборка должна размещаться в глобальном кэше сборок. Размещение в GAC позволяет различным приложениям ссылаться на сборку из разделяемой локации. Сборку можно разместить в GAC тремя возможными путями: Проводник Windows Инструмент Global Assembly Cache (gacutil.exe) Инсталляторы
Размещение сборки в GAC 2-3 Проводник Windows - Для размещения сборки в глобальном кэше сборок, просто перетащите сборку на папку глобального кэша. Инструмент Global Assembly Cache (gacutil.exe) - Этот инструмент, предоставляемый .NET Framework для установки и удаления из GAC. Синтаксис gacutil /i assemblyname где, assemblyname: Имя сборки для размещения в глобальном кэше сборок. Например, gacutil /i Employee.dll
Размещение сборки в GAC 3-3 Инталляторы - Используются для размещения сборок в GAC.
Просмотр всех сборок Все сборки внутри данной папки могут быть просмотрены с помощью Проводника Windows или в командной строке. Различные сборки: “Assembly” Папка “GAC_MSIL” Папка “Student” С помощью Проводника Windows “Assembly” - Сборка Student.dll с различными версиями установлена в папке сборки, которая будет просмотрена. Папка “GAC_MSIL” - Папка GAC_MSIL отображает подпапки. Папка “Student” - Отображает все подпапки сборки Student.dll. Using Windows Explorer - Изображение показывает, что сборка Student.dll имеет три версии: 1.1.0.0, 1.2.0.0, и 1.3.0.0.
Инструмент глобального кэша сборок Сборками можно манипулировать, их можно добавлять, удалять и просматривать с помощью инструмента глобального кэша сборок. Различные опции для gacutil.exe перечислены в таблице: Синтаксис gacutil /option AssemblyName Пример gacutil /u Employee.dll где, option: Опция командной строки. AssemblyName: Имя сборки.
Определение версионности Одна из наиболее важных проблем, связанная с разработкой программного обеспечения, это задача поддержки файлов и версионности. Поддержка версионности одной сборки бессмысленна, так как она находится в папке приложения, и два файла с одинаковым именем не могут находится в одной папке. Версионность важна для разделяемых сборок, когда несколько сборок с различными номерами версий могут быть загружены в GAC.
Версионность сборок 1-2 Позволяет разделять сборки в GAC. Сборки с одинаковыми именами, но различными версиями, могут сосуществовать в одной папке. Номер версии сборки может быть занесен вручную в файл AssemblyInfo.cs внутри папки приложения Properties.
Версионность сборок 2-2 Номер версии сборки .NET Версия сборки обычно состоит из четырех частей, разделяемых точками. Учитывает изменения в старшем или младшем номере версии. Изменения в номере ревизии (revision). Изменения в номере билда (build). Поддержка версионности сборки Устанавливается в файле Assemblyinfo.cs проекта. Получение номера версии - Следующий пример отображает номер версии для разделяемой сборки Student.dll. Пример using System.Collections.Generic; using System.Text; using System.Reflection; namespace Student { public class Student { static void Main(string[] args) { Assembly objAssembly = Assembly.GetAssembly(typeof(Student)); Console.WriteLine(objAssembly.FullName); Console.ReadLine(); } } } В примере объект сборки инициализирован передачей полностью заданного имени класса методу GetAssembly() класса Assembly.
Занятие 3 - Отражение На последнем занятии, Отражение, вы изучите: Определение процесса отражения (reflection). Список классов пространства имен System.Reflection. Список и описание методов и свойств класса Type.
Отражение (Reflection) Мощный способ сбора и манипулирования информацией, существующей в сборках приложений и их метаданными. Метаданные содержат всю информацию типов, используемых приложением. Классы, необходимые для извлечения информации, находятся в пространстве имен System.Reflection.
Извлечение метаданных из сборки Класс Assembly, представленный в пространстве имен System.Reflection, используется для получения информации и манипулирования сборками. Используется для определения и загрузки сборок, загрузки модулей, перечисленных в манифесте сборки. Используется для обнаружения типа в данной сборке и создания его экземпляра. Два метода получения объекта Type из сборок - Assembly.GetType или Assembly.GetTypes. Пример ... Assembly objAssemblyInformation = typeof(Object).Module.Assembly; // Загрузка сборки по имени ее файла objAssemblyInformation = Assembly.LoadFrom(“Employee.exe”); // Выгрузка типов, доступных в сборке Type [] assemblyTypeInformation = objAssemblyInformation.GetTypes(); foreach (Type TypeInformation in assemblyTypeInformation) { Console.WriteLine (TypeInformation.FullName); } ...
“System.Reflection” Некоторые наиболее важные классы в пространстве имен System.Reflection: Assembly Module ConstructorInfo MethodInfo EventInfo PropertyInfo ParameterInfo Assembly - Используется для определения сборки. Module - Используется для осуществления отражения модуля. ConstructorInfo - Используется для отражения конструктора. MethodInfo - Используется для получения такой информации, как имя, возвращаемый тип, параметры, модификаторы доступа и детали реализации. EventInfo - Используется для выборки информации об имени события, типе данных обработки события, пользовательских атрибутах, объявлении типа и отраженном типе события. PropertyInfo - Используется для выборки информации о имени свойства, типе данных, объявлении типа, отраженном типе и статусе свойства - доступно по записи или только по чтению. ParameterInfo - Используется для выборки информации о имени параметра, типе данных, позиции параметра в сигнатуре метода.
Класс “Type” 1-2 Различные типы - класс, интерфейс, перечисление, параметры типа, обобщенные определения типа, открытые или закрытые сконструированные обобщенные типы. Класс Type - база всей отражаемой информации для объекта.
Класс “Type” 2-2 Пример using System; using System.Reflection; public class Student { public Student() { } static Student() { } public Student(int i) { } public static void Main() { ConstructorInfo[] cons = typeof(Student).GetConstructors(); Console.WriteLine(cons.Length); for (int i = 0; i < cons.Length; i++) { Console.WriteLine(cons[i].IsPublic); } } } 2 True True Вывод Некоторые методы и свойства класса Type перечислены в таблице:
Резюме 1-2 Сборки Сборки - строительные блоки .NET Framework для решения проблем поддержки версионности и размещения DLL. Есть два типа сборок - приватные и разделяемые. Сборка содержит четыре части, называемые метаданными сборки, метаданными типа, кодом MSIL и ресурсами. Приватные или разделяемые сборки Приватная сборка размещается в приложении для эксклюзивного использования этим приложением. Разделяемые сборки доступны для использования несколькими приложениям. Каждая сборка, необходимая для нескольких приложений, хранится в GAC. Сборки в GAC могуть устанавливаться или удаляться с помощью инструмента gacutil.exe.
Резюме 2-2 Отражение (Reflection) Отражение - одна из особенностей .NET framework, имеющая важное значение для разработки больших приложений. Классы, необходимые для извлечения информации, находятся в пространстве имен System.Reflection. Класс System.Type содержит методы, позволяющие разработчику извлекать ценную информацию о текущем типе во время выполнения.
expc_module_17ru_1.ppt
- Количество слайдов: 47