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

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

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

Имена сборок

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

  1. Краткое название. В Windows это имя файла Portable Executable (PE) без расширения.
  2. Культура. Это идентификатор RFC 1766 языкового стандарта для сборки. Как правило, сборки библиотеки и процесса должны быть нейтральными по отношению к культуре; культура должна использоваться только для вспомогательных сборок .
  3. Версия. Это число, разделенное точками, состоит из четырех значений - основного, второстепенного, сборки и ревизии.
  4. Открытый ключ маркер. Это 64- битный хэш открытого ключа, который соответствует закрытому ключу, используемому для подписи сборки. Говорят, что подписанная сборка имеет строгое имя .

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

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

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

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

Сборки и безопасность 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 будет иметь имя CLI «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 для метода:

 .method private hidebysig static void  Main(string[] args) cil managed {
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       11 (0xb)
  .maxstack  1
  IL_0000:  ldstr      "Hello World"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret } // end of method Class1::Main

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

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

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