← Назад к вопросам

Что такое Сборка?

2.0 Middle🔥 151 комментариев
#Другое#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Сборка (Assembly) в .NET?

В контексте C# и платформы .NET, сборка (Assembly) — это фундаментальная единица развертывания, версионирования, безопасности и повторного использования кода. Это скомпилированный выходной файл (обычно с расширениями .exe или .dll), который содержит код на промежуточном языке (IL, MSIL, CIL), метаданные и манифест сборки. Сборка является минимальным модулем, который CLR (Common Language Runtime) загружает и выполняет.

Ключевые компоненты сборки

  1. Манифест сборки (Assembly Manifest):
    *   Это "оглавление" сборки, содержащее метаданные о ней самой.
    *   Включает: **имя сборки**, номер версии, информацию о культуре (локализации), **строгое имя (Strong Name)**, список всех файлов в сборке, зависимости от других сборок, а также наборы разрешений для выполнения.

  1. Метаданные (Metadata):
    *   Описывают типы (классы, интерфейсы, структуры), их члены (методы, свойства, поля), атрибуты и сигнатуры. Эти метаданные делают сборку **самоописыва\ющей**, устраняя необходимость в отдельных файлах описания типов (например, IDL или заголовочных файлах).

  1. Код на промежуточном языке (IL, CIL):
    *   Код, написанный на C#, компилируется не в машинные инструкции, а в независимый от платформы промежуточный язык. **JIT-компилятор (Just-In-Time)** преобразует IL в машинный код во время выполнения.

  1. Ресурсы (Resources):
    *   Дополнительные файлы, такие как строки локализации, изображения, значки или любые другие встроенные данные, необходимые приложению.

Типы сборок

  • Исполняемые сборки (.exe): Содержат точку входа (Main метод) и могут быть запущены как самостоятельное приложение.
  • Библиотеки сборок (.dll): Не имеют точки входа и предназначены для использования другими сборками. Они содержат многократно используемые типы и логику.

Важность и роль сборок

  • Единица развертывания: Приложение или библиотека в .NET поставляется в виде одной или нескольких сборок. Это файлы, которые вы копируете на целевой компьютер.
  • Единица версионирования: CLR распознает версию сборки через манифест, что позволяет управлять совместимостью и избежать "DLL Hell". Разные версии одной сборки могут сосуществовать.
  • Единица безопасности: Разрешения для кода (например, доступ к файловой системе или реестру) проверяются и назначаются на уровне сборки на основе ее сильного имени или подписи.
  • Единица выполнения: CLR загружает сборки по требованию (On-Demand) для выполнения кода. Область видимости типов по умолчанию ограничена сборкой.

Пример простой сборки и ее манифеста

Рассмотрим пример простой библиотеки и использование утилиты ildasm.exe для просмотра манифеста.

Код простой библиотеки (MathOperations.dll):

using System;

namespace MathLibrary
{
    public class Calculator
    {
        public int Add(int a, int b) => a + b;
        public int Subtract(int a, int b) => a - b;
    }
}

После компиляции этой библиотеки можно условно представить ключевые части манифеста (в реальности он находится в двоичном формате):

.assembly MathLibrary
{
  .ver 1:0:0:0          // Версия сборки
  .culture neutral      // Культура (нейтральная)
  // ... другие атрибуты, включая открытый ключ для строгого имени
}
.assembly extern mscorlib // Ссылка на внешнюю сборку
{
  .ver 4:0:0:0
  .publickeytoken = (B7 7A 5C 56 ... ) // Токен открытого ключа базовой библиотеки
}
.module MathOperations.dll // Имя файла модуля

Работа со сборками в коде

Вы можете динамически загружать сборки и работать с их типами с помощью рефлексии (Reflection).

using System;
using System.Reflection;

public class AssemblyLoader
{
    public void LoadAndUseAssembly()
    {
        // Динамическая загрузка сборки
        Assembly mathAssembly = Assembly.LoadFrom("MathOperations.dll");

        // Получение информации о типах
        Type calculatorType = mathAssembly.GetType("MathLibrary.Calculator");

        // Создание экземпляра типа
        object calculatorInstance = Activator.CreateInstance(calculatorType);

        // Вызов метода через рефлексию
        MethodInfo addMethod = calculatorType.GetMethod("Add");
        int result = (int)addMethod.Invoke(calculatorInstance, new object[] { 5, 3 });

        Console.WriteLine($"Результат сложения: {result}"); // Вывод: 8
    }
}

Глобальный кэш сборок (GAC)

Для совместного использования сборок несколькими приложениями на одном компьютере используется Global Assembly Cache (GAC). В него можно помещать сборки со строгими именами, что обеспечивает централизованное управление версиями и безопасность. Однако в современных версиях .NET (.NET Core/.NET 5+) акцент смещен на локальное развертывание зависимостей.

Итог: Сборка — это больше, чем просто DLL или EXE файл. Это логический контейнер, который обеспечивает структуру, безопасность, надежное версионирование и независимость от платформы для кода .NET, являясь краеугольным камнем всей архитектуры управления кодом в этой экосистеме.