Пространство имен System в .NET реализовано в одной DLL или в нескольких?

Ответ

Типы из пространства имен System распределены по множеству различных сборок (DLL). Это архитектурное решение, позволяющее подключать только необходимые функциональности и уменьшать размер приложений, особенно в .NET Core и современных версиях .NET.

Ключевые сборки, содержащие типы System:

  • System.Private.CoreLib.dll (в .NET Core/.NET 5+): Содержит фундаментальные типы, такие как System.Object, System.String, System.Int32, базовые интерфейсы и атрибуты. Это "ядро" среды выполнения.
  • System.Runtime.dll: Содержит многие другие базовые типы и интерфейсы.
  • Специализированные сборки: Конкретные функциональные области вынесены в отдельные DLL, которые добавляются как зависимости по мере необходимости.
    • System.Collections.dll — основные коллекции (List<T>, Dictionary<TKey, TValue>).
    • System.IO.dll — работа с файлами и потоками.
    • System.Threading.Tasks.dll — типы для асинхронного программирования (Task, ValueTask).

Как это выглядит на практике: В файле проекта .csproj зависимости добавляются автоматически или вручную.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>
  <!-- Явное добавление пакета, если тип из него используется, а ссылки нет -->
  <ItemGroup>
    <PackageReference Include="System.Text.Json" Version="8.0.0" />
  </ItemGroup>
</Project>

Вывод: Пространство имен System — это логическая группировка, а не физическая сборка. Современные приложения .NET ссылаются на десятки сборок, содержащих части этого пространства имен.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня творится с этим вашим System! Все думают, что есть одна жирная библиотека System.dll, куда всё запихали, как в чулан. Ан нет, блядь!

Оказалось, эти умники из Microsoft всё по полочкам разложили — по куче разных DLL-шек. Зачем? А чтобы твоё приложение не тащило за собой всю вселенную, если тебе нужен только List<int> да файлик прочитать. Особенно в этих новых .NET Core и .NET 5+ — там вообще жёсткая диета, только по потребностям.

Главные бандиты, где прячутся System-шные типы:

  • System.Private.CoreLib.dll — это, сука, святая святых, ядро! Тут живёт сам System.Object, System.String (наша всеми любимая строка), System.Int32 и прочая базовая хрень. Без этой DLL ты нихуя не скомпилируешь.
  • System.Runtime.dll — тут уже другие базовые штуки досыпали, чтобы CoreLib не раздувалась до неприличия.
  • А дальше — специализация по полной. Каждая область — в свою квартиру:
    • Хочешь коллекции (List<T>, Dictionary)? System.Collections.dll, получай!
    • Нужно по файлам пошарить? Вали в System.IO.dll.
    • Асинхронностью побаловаться с Task? System.Threading.Tasks.dll тебе в помощь.

Как это в жизни выглядит? Вот смотришь ты на свой .csproj файл, а там такая картина:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>
  <!-- Допустим, тебе JSON понадобился, а ссылки нет — ручками добавляешь -->
  <ItemGroup>
    <PackageReference Include="System.Text.Json" Version="8.0.0" />
  </ItemGroup>
</Project>

Короче, вывод простой, как три копейки: System — это просто вывеска, логическая группа, а не один толстый монолит. Современное .NET-приложение — это как пазл из десятков мелких сборок, в каждой из которых лежит свой кусочек этого самого пространства имён. Ёперный театр, но зато экономно!