Сборки и загрузчик сборок

Сборка (assembly) — это дискретная единица многократно используемого кода внутри CLR. По своей природе она подобна DLL-библиотеке из мира неуправляемого кода, но на этом все сходство заканчивается. Сборка может состоять из множества модулей, которые объединяет вместе манифест описывающий содержимое сборки. С точки зрения операционной системы, модуль идентичен DLL-библиотеке. Сборки могут иметь присоединенные к ним версии, что позволяет идентифицировать одноименные сборки, но с разными версиями, как отдельные.

Сборки также содержат метаданные, описывающие содержащиеся в них типы. При поставке “родной” DLL-библиотеки обычно включается заголовочный файл и/или документация, описывающая экспортированные функции. Метаданные удовлетворяют этим требованиям, полностью описывая типы, содержащиеся внутри сборки. Короче говоря, сборки — это снабженные версиями, самоописательные единицы многократно используемого кода в среде CLR.

В результате компиляции программы “Hello World!” получается файл .ехе, который фактически является сборкой. Для создания управляемых сборок может применяться любой управляемый язык. Более того, в большинстве случаев любой другой управляемый язык может использовать управляемые сборки, написанные на любом управляемом языке.

Таким образом, очень легко создавать сложные системы, разрабатываемые на нескольких управляемых языках. Например, для создания низкоуровневых типов наиболее естественным языком может оказаться C++/CLI, пользовательский интерфейс верхнего уровня лучше создавать на С# или Visual Basic, а код, выполняющий сложные вычисления — на языке F#.

Чтобы обеспечить функциональную совместимость между разными языками, в CLI определено подмножество общей системы типов (Common Type System — CTS), которое называется спецификацией общего языка (Common Language Specification — CLS). Если вы применяете в своих сборках только CLS-совместимые типы, то можете быть уверены, что код на любом управляемом языке сможет их использовать.

Назначение сборкам имен

Именовать можно двумя основными способами.

• Строгое (полное) именование. Такая сборка имеет имя, состоящее из четырех частей: краткое имя сборки, номер версии, идентификатор культуры в формате ISO и хеш-маркер. Если имя сборки состоит из всех четырех частей, она считается строго именованной.

• Частичное именование. Такая сборка имеет имя, в котором опущены некоторые детали строго именованной сборки.

Чтобы получить представление о том, как выглядит имя сборки, откройте Windows Explorer и перейдите к глобальному кэшу сборок (Global Assembly Cache — GAC), находящемуся в каталоге %systemroot%\assembly. В действительности структура каталогов очень сложна, но подключаемый модуль GAC Explorer представляет то, что вы видите, в браузере. Если вы перейдете в тот же каталог с помощью командной строки, то увидите имена каталогов, используемые GAC для хранения сборок.

Не пытайтесь вмешиваться в эту структуру каталогов, иначе вы можете серьезно повредить GAC. Сосредоточившись на представлении в Explorer, можно увидеть имена сборок, состоящие из четырех частей. Если часть, описывающая культуру, имени сборки пуста, это значит, что данная сборка нейтральна в отношении культуры, что присуще сборкам, содержащим только код.

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

Преимущество строго именованных сборок состоит в том, что они могут быть зарегистрированы в GAC и стать доступными для использования всеми приложениями системы. Регистрация сборки в GAC аналогична регистрации в системном реестре СОМ-сервера.

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

Загрузчик сборок во время своей работы проходит через довольно сложную процедуру. Часть этого процедуры относится к определению, какую версию сборки необходимо загрузить. Используя конфигурационные файлы приложения, можно предоставить загрузчику некоторые подсказки во время определения версии.

CLR может загружать сборки по мере надобности, или же вы можете загрузить их явно вызовом АррDomain. Load (). Загрузчик просматривает частично именованные сборки в том же каталоге, где находится работающее приложение, или в его подкаталогах.

Во время поиска сборки загрузчик может также обратиться к GAC; например, при загрузке сборки с полностью квалифицированным именем загрузчик просматривает GAC перед обращением к локальным каталогам.

Версии играют ключевую роль во время загрузки сборок, и все сборки снабжены информацией о версии. Механизм контроля версий был встроен в загрузчик CLR изначально, и это исключает такую неприятность, которая называется адом DLL (DLL Hell), когда замена совместно используемой DLL-библиотеки ее новой версией приводит к нарушению работы приложений, пользующихся старой версией этой библиотеки.

Если вы — ветеран, которому пришлось разрабатывать программное обеспечение для Windows в течение последних 15 лет или около того, то вы определенно испытали это на себе. В CLR множество версий одной и той же сборки могут мирно сосуществовать на одной и той же машине без каких-либо конфликтов между собой.

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

Загрузка сборок и работа с версиями — исключительно сложная тема, и ее освещение выходит за рамки этой статьи. Пред тем, как загрузить сборку, загрузчик использует различные эвристические приемы для определения того, какую версию следует загрузить.

Определив версию, он передает эту информацию вниз — низкоуровневому методу загрузки сборок.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100