Збірка є одиночним файл Portable Executable (PE) з розширенням .exe в разі застосування або .dll в разі багаторазово використовуваної бібліотеки.
вміст збірки
- Маніфест збірки - містить відомості для виконуючого середовища .NET: ім'я збірки, версія, необхідні права доступу, посилання на інші збірки.
- Маніфест додатка - містить відомості для операційної системи: спосіб розгортання зборки, необхідність адміністраторських повноважень.
- Скомпільований типи - скомпільований код IL і метадані типів, включених в збірку.
- Ресурси - інші дані, включені в збірку: зображення, що локалізуються тексти.
Обов'язковою є тільки маніфест збірки (хоча як правило містяться скомпільовані типи. Виконувані файли і бібліотеки мають однакову структуру, основна відмінність в тому, що виконувані файли містять точку входу.
маніфест збірки
Маніфест збірки обов'язково повинен містити:
- просте ім'я збірки
- номер версії (AssemblyVersion)
- відкритий ключ і підписаний хеш збірки, якщо вона має суворе ім'я
- список засланих збірок (включаючи їх версії і відкриті ключі)
- список модулів збірки
- список типів, визначених в збірці, і модулів, що містять кожен тип
- необов'язковий набір прав доступу, необхідних або відхиляються складанням (SecurityPermission)
- цільова культура якщо це підпорядкована збірка (AssemblyCulture)
Також маніфест збірки може містити:
Деякі з цих даних виводяться з параметрів, переданих компілятори. Решта беруться з атрибутів збірки (вказані в дужках):
Вміст збірки насправді упаковано в один або кілька контейнерів, які називаються модулями. Модуль відповідає одному файлу збірки і дає можливість створювати збірки, що складаються з декількох файлів. У багатофайлову збірці головний модуль завжди містить маніфест, а додаткові модулі можуть містити код і / або ресурси. Маніфест описує відносне розташування всіх модулів збірки.
клас Assembly
Клас System.Reflection.Assembly дозволяє отримати доступ до метаданих збірки під час виконання. Отримати об'єкт збірки можна декількома способами:
- за допомогою властивості Assembly класу Type:
- GetExecutingAssembly - повертає збірку, яка містить виконувану функцію (метод)
- GetCallingAssembly - повертає збірку, яка містить функцію, яка викликала поточну виконувану функцію
- GetEntryAssembly - повертає збірку, що містить точку входу в додаток
Отримавши об'єкт Assembly за допомогою його методів і властивостей можна отримати метадані збірки і виконувати рефлексію її типів.
Члени класу Assembly:
- FullName. GetName - повертає повністю задане ім'я або об'єкт AssemblyName
- CodeBase. Location - місце розташування файлу збірки
- Load. LoadFrom. LoadFile - вручну завантажує збірку в поточний домен додатки
- GlobalAssemblyCache - вказує, чи знаходиться збірка в GAC
- GetSatelliteAssembly - знаходить підпорядковану збірку із заданою культурою
- GetType. GetTypes - повертає тип або всі типи, певні в збірці
- EntryPoint - повертає метод точки входу в додаток як об'єкт MethodInfo
- GetModules. ManifestModule - повертає всі модулі або головний модуль збірки
- GetCustomAttributes - повертає атрибути збірки
імена збірок
Ідентифікатор збірки складається з чотирьох частин:
- просте ім'я
- версія ( «0.0.0.0» якщо не задана)
- культура ( «neutral» для не підпорядкованих збірок)
- маркер відкритого ключа ( «null» якщо збірка не має строгого імені)
Просте ім'я береться з імені файлу, в який збірка була спочатку скомпільована. Розширення відкидається, наприклад, просте ім'я для збірки System.Xml.dll виглядає як System.Xml. Перейменування файлу не змінює просте ім'я збірки.
Номер версії береться з атрибуту AssemblyVersion і являє собою рядок, розділену на 4 частини:
void SetPublicKeyToken (byte [] publicKeyToken);
Властивість Version повертає об'єкт типу Version. який сам має властивості Major. Minor. Build і Revision. Оскільки версія збірки, що задається атрибутом AssemblyVersion. є частиною імені збірки, її зміна в деяких випадках не бажано. Крім атрибута AssemblyVersion існують ще два атрибути задають версію, але носять чисто інформативний характер і ніяк не враховуються середовищем CLR:
- AssemblyInformationalVersion - інформаційна версія - задає версію, що відображається кінцевому користувачеві. Вона видно в діалоговому вікні властивостей файлу в поле Product Version (Версія продукту). Тут може знаходитися будь-який рядок, наприклад, 5.1 Beta 2. Зазвичай всі збірки в додатку мають однакову інформаційну версію.
- AssemblyFileVersion - файлова версія - посилається на номер компонування (build) збірки. Відображається в діалоговому вікні властивостей файлу в поле File Version (Версія файлу). Як і AssemblyVersion повинна містити рядок розділену на 4 частини.
Суворі імена (Strong Names)
Суворі імена допомагають захистити збірку від підробки. Строго іменована збірка має унікальний і не підробляється ідентифікатор, що досягається шляхом додавання в маніфест збірки наступних метаданих:
Щоб призначити збірці суворе ім'я необхідно спочатку згенерувати файл з парою ключів, наприклад, за допомогою утиліти sn.exe. Утиліта створить файл з розширенням .snk, що містить пару ключів. Потім збірку потрібно скомпілювати з параметром / keyfile:
Клас Publisher в просторі імен System.Security.Policy містить властивість Certificate. Якщо це властивість повертає значення відмінне від null, значить збірка підписана системою Authenticode.
Підпис Authenticode не є частиною імені збірки.
GAC - глобальний кеш збірок (Global Assembly Cache)
При установці .NET Framework створює на комп'ютері централізований репозиторій збірок - глобальний кеш збірок (Global Assembly Cache - GAC). GAC містить збірки самої платформи .NET Framework, і в нього також можна додавати власні збірки. Основною особливістю GAC є централізована підтримка версій (управляється адміністратором на рівні машини). Якщо така підтримка справді потрібна, можна додати збірки в GAC, у всіх інших випадках це тільки ускладнить розробку. розгортання і підтримку програми.
Щоб встановити збірку в GAC їй перш за все потрібно поставити суворе ім'я. Після цього її можна додати в GAC за допомогою утиліти gacutil:
Установку збірок в GAC можна задати як частина проекту установки в Visual Studio.
Після завантаження збірки в GAC додатки можуть посилатися на неї, не потребуючи в локальній копії. При цьому якщо локальна копія присутній, вона буде проігнорована на користь збірки з GAC.
Збірка крім вихідного коду може містити ресурси: текст, зображення і XML-файли. Зазвичай в якості ресурсів в збірку додаються зображення або локалізуемие дані. Ресурс збірки в кінцевому підсумку являє собою байтовий потік з ім'ям. Збірка зберігає їх в словниках із строковими ключами.
Локалізуемое вміст спочатку додається в файли .resources. При компіляції вони упаковуються як індивідуальні підлеглі збірки, які автоматично вибираються під час виконання на основі мови ОС.
Безпосереднє вбудовування ресурсів
Щоб вбудувати ресурс безпосередньо в збірку потрібно скомпілювати її з одним або декількома параметрами / resource:
Тут XX - двобуквений код мови (наприклад, de) або код мови і регіону (наприклад, en-GB).
Щоб додати підлеглу збірку потрібно додати в проект ще один файл .resx. назва якого повинно містити код локалізації (відокремлений крапкою), наприклад, welcome.de.resx. При компіляції в Visual Studio буде автоматично створений підкаталог (наприклад, de), а в ньому підпорядкована збірка (наприклад, MyApp.resources.dll).
Культури поділяються на власне культури і субкультури. культура являє конкретну мову, а субкультура - регіональний варіант цієї мови. Культура позначається за допомогою двобуквеного коду (наприклад, en. De), а субкультури - за допомогою чотирибуквене (en-AU. De-AT).
В .NET культура представлена класом System.Globalization.CultureInfo. Поточну культуру можна отримати наступним способом:
Властивість CurrentCulture відображає регіональні настройки Windows, а властивість CurrentUICulture - мову призначеного для користувача інтерфейсу.
дозвіл збірок
Під час виконання схема трохи складніше. При першому зверненні до якогось типу CLR спочатку визначає, чи знаходиться він в поточній збірці або в зовнішній. Якщо тип знаходиться у зовнішній збірці, CLR перевіряє завантажена вже ця збірка в пам'ять. Якщо збірка не завантажена, CLR намагається її знайти. Насамперед перевіряється GAC, потім базовий каталог додатки та інші шляхи пошуку (якщо задані). Якщо складання знайти не вдалося, генерується подія AppDomain.AssemblyResolve. яке можна перехопити і завантажити збірку вручну. Якщо після цього збірка все одно не знайдена CLR генерує виняток.