Сборка (CLI) - Assembly (CLI)

Определяется Microsoft для использования в последних версиях Windows, сборка в Общая языковая инфраструктура (CLI) - это составлен библиотека кода, используемая для развертывания, управления версиями и безопасности. Бывают двух типов: технологические сборки (EXE ) и библиотечные сборки (DLL ). Сборка процесса представляет собой процесс, который будет использовать классы определены в сборках библиотеки. Сборки CLI содержат код в CIL, который обычно генерируется из Язык интерфейса командной строки, а затем скомпилирован в машинный язык в время выполнения посредством своевременный компилятор. в .NET Framework реализации, этот компилятор является частью общеязыковая среда выполнения (CLR).

Сборка может состоять из одного или нескольких файлов. Файлы кода называются модулями. Сборка может содержать более одного модуля кода. А так как можно использовать разные языки Для создания модулей кода технически возможно использовать несколько разных языков для создания сборки. Visual Studio однако не поддерживает использование разных языков в одной сборке.

Названия сборок

Название сборки состоит из четырех частей.

  1. Краткое название. В Windows это имя Переносимый исполняемый файл (PE) файл без расширения.
  2. Культура. Это RFC 1766 идентификатор локали сборки. Как правило, сборки библиотеки и процесса должны быть нейтральными по отношению к культуре; культуру следует использовать только для спутниковые сборки.
  3. Версия. Это номер с точками состоит из четырех значений - major, minor, build и revision.
  4. А открытый ключ токен. Это 64-кусочек хэш открытого ключа, соответствующего закрытому ключу, используемому для знак[1] Ассамблея. Подписанная сборка называется сильное имя.

Токен открытого ключа используется, чтобы сделать имя сборки уникальным. Таким образом, две сборки со строгими именами могут иметь одно и то же имя PE-файла, и все же CLI распознает их как разные сборки. Окна файловая система (FAT32 и NTFS ) распознает только имя PE-файла, поэтому две сборки с одинаковым именем PE-файла (но с разными культурами, версией или токеном открытого ключа) не могут существовать в одной папке Windows. Чтобы решить эту проблему, CLI представляет GAC (Глобальный кэш сборок ), который во время выполнения обрабатывается как одна папка, но на самом деле реализован с использованием вложенных папок файловой системы.

Предотвращать спуфинговые атаки, где взломщик попытается выдать сборку за что-то еще, сборка подписана закрытым ключом. Разработчик предполагаемой сборки хранит закрытый ключ в секрете, поэтому взломщик не может получить к нему доступ или просто угадать. Таким образом, взломщик не может заставить свою сборку имитировать что-то еще, не имея возможности правильно подписать ее после изменения. Подписание сборки включает взятие хэша важных частей сборки, а затем шифрование хеш с закрытым ключом. Подписанный хэш сохраняется в сборке вместе с открытым ключом. Открытый ключ расшифрует подписанный хэш. Когда CLR загружает сборку со строгим именем, она генерирует хэш из сборки, а затем сравнивает его с расшифрованным хешем. Если сравнение прошло успешно, это означает, что открытый ключ в файле (и, следовательно, токен открытого ключа) связан с закрытым ключом, используемым для подписи сборки. Это будет означать, что открытый ключ в сборке является открытым ключом издателя сборки и, следовательно, предотвращается атака с подделкой.

Версии сборки

Сборки CLI могут иметь информацию о версии, что позволяет им устранить большинство конфликтов между приложениями, вызванных общими сборками.[2] Однако это не устраняет все возможные конфликты управления версиями между сборками.[3]

Сборки и безопасность CLI

CLI Безопасность доступа кода базируется на сборках и свидетельство. Свидетельством может быть что угодно, выведенное из сборки, но обычно оно создается из источника сборки - была ли сборка загружена из Интернета, или интранет, или установлен на локальном компьютере (если сборка загружена с другого компьютера, она будет сохранена в в песочнице расположение в GAC и, следовательно, не считается установленным локально). Разрешения применяются ко всем сборкам, и сборка может указать минимальные разрешения, необходимые для нее, с помощью настраиваемых атрибутов (см. Метаданные CLI ). Когда сборка загружена, среда CLR будет использовать свидетельство сборки для создания набора разрешений из одного или нескольких разрешений доступа к коду. Затем среда CLR проверит, содержит ли этот набор разрешений необходимые разрешения, указанные сборкой.

Код CLI может выполнять требование безопасности доступа кода. Это означает, что код будет выполнять какое-то привилегированное действие, только если все сборки всех методы в стек вызовов иметь указанное разрешение. Если одна сборка не имеет разрешения, ценная бумага исключение брошен.

Код CLI также может выполнять связанный запрос для получения разрешения из стека вызовов. В этом случае CLR будет рассматривать только один метод в стеке вызовов в позиции TOP для указанного разрешения. Здесь обход стека привязан к одному методу в стеке вызовов, с помощью которого среда CLR предполагает, что все другие методы в СТЕКЕ ВЫЗОВОВ имеют указанное разрешение. Сборка представляет собой комбинацию файлов METADATA и MSIL.

Спутниковые сборки

Как правило, сборки должны содержать ресурсы, не зависящие от языка и региональных параметров. Если вы хотите локализовать свою сборку (например, использовать другой струны для разных языков) следует использовать вспомогательные сборки - специальные сборки, предназначенные только для ресурсов. Как следует из названия, сателлит связан со сборкой, называемой основной сборкой. Эта сборка (скажем, lib.dll) будет содержать нейтральные ресурсы (которые, по словам Microsoft, являются международными. английский, но подразумевает, что это американский английский). У каждого сателлита есть имя связанной библиотеки с добавлением .resources (например, lib.resources.dll). Сателлиту дается ненейтральное имя культуры, но поскольку оно игнорируется существующими файловыми системами Windows (FAT32 и NTFS), это может означать, что в одной папке может быть несколько файлов с одинаковым именем PE. Поскольку это невозможно, спутники должны храниться во вложенных папках в папке приложения. Например, спутник с ресурсами UK English будет иметь имя интерфейса командной строки «lib.resources Version = 0.0.0.0 Culture = en-GB PublicKeyToken = null», имя PE-файла lib.resources.dll и будет сохранен в подпапке en-GB.

Спутники загружаются с помощью класса CLI, называемого System.Resources.ResourceManager. Разработчик должен указать имя ресурса и информацию об основной сборке (с нейтральными ресурсами). Класс ResourceManager считывает локаль компьютера и использует эту информацию и имя основной сборки, чтобы получить имя спутника и имя вложенной папки, которая его содержит. ResourceManager затем можно загрузить спутник и получить локализованный ресурс.

Ссылки на сборки

Можно ссылаться на библиотеку исполняемого кода, используя флаг / reference компилятора C #.

Отсрочка подписания сборки

Общие сборки должны давать строгое имя для однозначной идентификации сборки, которая может совместно использоваться приложениями. Строгое именование состоит из токена открытого ключа, языка и региональных параметров, версии и имени PE-файла. Если сборка, вероятно, будет использоваться для целей разработки, которая является общей сборкой, процедура строгого именования содержит только генерацию открытого ключа. При этом закрытый ключ не создается. Он генерируется только при развертывании сборки.

Язык сборки

Сборка построена с помощью кода CIL, который является промежуточным языком. Фреймворк внутренне преобразует CIL [байт-код] в собственный код сборки. Если у нас есть программа, которая печатает «Hello World», эквивалентный код CIL для метода:

 .метод частный Hidebysig статический пустота  Главный(нить[] аргументы) cil удалось {  .входная точка  .обычай пример пустота [mscorlib]Система.STAThreadAttribute::.ctor() = ( 01 00 00 00 )  // Размер кода 11 (0xb)  .maxstack  1  IL_0000:  ldstr      "Привет, мир"  IL_0005:  вызов       пустота [mscorlib]Система.Консоль::WriteLine(нить)  IL_000a:  Ret } // конец метода Class1 :: Main

Код CIL загружает строку в стек, затем вызывает функцию WriteLine и возвращается.

Смотрите также

Рекомендации

  1. ^ Присвоение сборки .NET строгого имени
  2. ^ Труш, Филипп (12 августа 2008 г.). «Жизненный цикл управления версиями сборки .NET». Архивировано из оригинал 24 октября 2008 г.. Получено 21 сентября 2008.
  3. ^ Пирсон, Гарри (17 сентября 2008 г.). "Пожарная тренировка по изменению пространства имен DLR". Архивировано из оригинал 1 ноября 2008 г.. Получено 21 сентября 2008.