Сборка (CLI)
определенная Microsoft для использования в последних версиях Windows , Сборка в Common Language Infrastructure (CLI), представляет собой скомпилированную библиотеку кода, используемую для развертывания, управления версиями и безопасности. Существует два типа: сборки процессов ( EXE ) и сборки библиотек ( DLL ). Сборка процесса представляет собой процесс, который будет использовать классы, определенные в сборках библиотеки. Сборки CLI содержат код на CIL , который обычно генерируется на языке CLI , а затем компилируется в машинный язык во время выполнения с помощью JIT-компилятора . В реализации .NET Framework этот компилятор является частью среды Common Language Runtime (CLR).
Сборка может состоять из одного или нескольких файлов. Файлы кода называются модулями. Сборка может содержать более одного модуля кода. А поскольку для создания модулей кода можно использовать разные языки , то технически возможно использовать несколько разных языков для создания сборки. Однако Visual Studio не поддерживает использование разных языков в одной сборке.
Имена сборок
[ редактировать ]Название сборки состоит из четырех частей.
- Краткое имя. В Windows это имя переносимого исполняемого файла (PE) без расширения.
- Культура. Это идентификатор языкового стандарта сборки в соответствии с RFC 1766. В целом библиотеки и процессные сборки должны быть культурно нейтральными; культуру следует использовать только для спутниковых сборок .
- Версия. Это пунктирное число, состоящее из четырех значений: основное, второстепенное, сборка и ревизия.
- Токен открытого ключа . Это 64- битный хэш открытого ключа, соответствующий закрытому ключу, используемому для подписи. [ 1 ] сборка. Говорят, что подписанная сборка имеет строгое имя .
Токен открытого ключа используется для того, чтобы сделать имя сборки уникальным. Таким образом, две сборки со строгими именами могут иметь одно и то же имя PE-файла, но интерфейс командной строки распознает их как разные сборки. Windows Файловая система ( FAT32 и NTFS ) распознает только имя PE-файла, поэтому две сборки с одинаковым именем PE-файла (но с разными региональными параметрами, версией или токеном открытого ключа) не могут существовать в одной папке Windows. Чтобы решить эту проблему, CLI вводит GAC ( глобальный кэш сборок ), который во время выполнения рассматривается как одна папка, но фактически реализуется с использованием вложенных папок файловой системы.
Чтобы предотвратить атаки спуфинга , когда взломщик пытается выдать сборку за что-то другое, сборка подписывается закрытым ключом. Разработчик предполагаемой сборки хранит закрытый ключ в секрете, поэтому взломщик не может получить к нему доступ или просто угадать его. Таким образом, взломщик не может заставить свою сборку выдать себя за что-то другое, не имея возможности правильно подписать ее после изменения. Подписание сборки предполагает получение хеша важных частей сборки и последующее шифрование хеша с помощью закрытого ключа. Подписанный хэш хранится в сборке вместе с открытым ключом. Открытый ключ расшифровывает подписанный хэш. Когда CLR загружает сборку со строгим именем, она генерирует хеш из сборки, а затем сравнивает его с расшифрованным хешем. Если сравнение завершается успешно, это означает, что открытый ключ в файле (и, следовательно, токен открытого ключа) связан с закрытым ключом, используемым для подписи сборки. Это будет означать, что открытый ключ в сборке является открытым ключом издателя сборки и, следовательно, предотвращается подмена атаки.
Версии сборки
[ редактировать ]Сборки CLI могут иметь информацию о версии, что позволяет им устранять большинство конфликтов между приложениями, вызванных общими сборками. [ 2 ] Однако это не устраняет все возможные конфликты версий между сборками. [ 3 ]
Сборки и безопасность CLI
[ редактировать ]CLI Безопасность доступа к коду основана на сборках и доказательствах . Доказательством может быть что угодно, полученное из сборки, но обычно оно создается из источника сборки: была ли сборка загружена из Интернета, интрасети или установлена на локальном компьютере (если сборка загружена с другого компьютера, она будет храниться в изолированной среде внутри GAC и, следовательно, не считается установленным локально). Разрешения применяются ко всем сборкам, и сборка может указать минимальные необходимые ей разрешения с помощью настраиваемых атрибутов (см. метаданные CLI ). Когда сборка загружается, CLR будет использовать свидетельства сборки для создания набора разрешений, состоящего из одного или нескольких разрешений на доступ к коду. Затем среда CLR проверит, содержит ли этот набор разрешений необходимые разрешения, указанные сборкой.
Код CLI может выполнять требования безопасности доступа к коду. Это означает, что код выполнит какое-то привилегированное действие только в том случае, если все сборки всех методов в стеке вызовов имеют указанное разрешение. Если одна сборка не имеет разрешения, исключение выдается безопасности.
Код CLI также может выполнять Linked Demand для получения разрешения из стека вызовов. В этом случае CLR будет просматривать только один метод в стеке вызовов в позиции TOP для указанного разрешения. Здесь обход стека привязан к одному методу в стеке вызовов, благодаря чему CLR предполагает, что все остальные методы в стеке вызовов имеют указанное разрешение. Сборка представляет собой комбинацию МЕТАДАННЫХ и файла MSIL.
Сателлитные сборки
[ редактировать ]Как правило, сборки должны содержать нейтральные к культуре ресурсы. Если вы хотите локализовать свою сборку (например, использовать разные строки для разных локалей), вам следует использовать вспомогательные сборки — специальные сборки, содержащие только ресурсы. Как следует из названия, сателлит связан со сборкой, называемой основной сборкой. Эта сборка (скажем, lib.dll) будет содержать нейтральные ресурсы (которые, по словам Microsoft, являются международным английским языком , но подразумевают американский английский). К каждому спутнику добавляется имя связанной библиотеки с расширением .resources (например, lib.resources.dll). Сателлиту присваивается ненейтральное имя культуры, но поскольку оно игнорируется существующими файловыми системами Windows (FAT32 и NTFS), это будет означать, что в одной папке может быть несколько файлов с одинаковым именем PE. Поскольку это невозможно, спутники необходимо хранить в подпапках папки приложения. Например, сателлит с британскими английскими ресурсами будет иметь имя 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 и возвращает результат.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Присвоение сборке .NET строгого имени» . Архивировано из оригинала 24 февраля 2012 года . Проверено 29 марта 2007 г.
- ^ Труш, Филипп (12 августа 2008 г.). «Жизненный цикл управления версиями сборки .NET» . Архивировано из оригинала 24 октября 2008 года . Проверено 21 сентября 2008 г.
- ^ Пирсон, Гарри (17 сентября 2008 г.). «Пожарные учения по изменению пространства имен DLR» . Архивировано из оригинала 1 ноября 2008 года . Проверено 21 сентября 2008 г.