Основным блоком .NET приложений является не модуль, а сборка (assembly) — самоописываемый набор кода, ресурсов и метаданных. Сборка может состоять из одного или нескольких файлов - все зависит от выбранных средств и компиляторов. В контексте среды CLR сборку можно назвать компонентом.
Сборка позволяет разделить логическое и физическое представления компонента, поддерживающего многократное использование, безопасность и управление версиями. Разбиение программного кода и ресурсов на разные файлы полностью определяется желаниями разработчика. Отдельные файлы могут загружаться по запросу из Интернета по мере необходимости в процессе выполнения программы. Если некоторые файлы не потребуются, то они не будут загружаться, что сохранит место на жестком диске и сократит время установки программы. Сборки позволяют разбить на части процесс развертывания файлов и в то же время рассматривать все файлы как одну коллекцию.
Содержимое сборки описано в ее декларации (manifest) (Декларация —один из наборов таблиц в метаданных). У каждой сборки имеется только одна декларация, которая содержит все сведения, описывающие эту сборку, в частности, какие из реализованных типов будут использоваться за пределами сборки. Декларация сборки хранится в отдельном файле либо в одном из модулей сборки. Сборка также содержит один или несколько модулей.
Модуль (module) хранит код приложения или библиотеки, а также метаданные, описывающие этот код. Во время компиляции проекта в сборку исходный текст, написанный на языке высокого уровня, транслируется в IL-код. Модули сборки также содержат сведения о других сборках, на которые они ссылаются (в том числе номера их версий). Эти данные делают сборку самоописываемой (selfdescrinbing). Не нужно размещать никакой дополнительной информации ни в системном реестре, ни в доменной службе AD DS (Active Directory Domain Services). Вследствие этого развертывать сборки гораздо проще, чем неуправляемые компоненты.
Алгоритм исполнения сборки
CLR создает процесс, в котором будет работать приложение, и начинает исполнять его код. При этом первая порция исполняемого кода (в виде команд языка IL) загружается в память и компилируется JIT-компилятором (Just-In-Time compiler) в машинные коды, специфичные для данного компьютера. Машинный код исполняется и остается в памяти, поэтому каждый фрагмент кода компилируется не более одного раза во время исполнения приложения.