Что такое .NET?

Тезисное, но ёмкое определение, актуальное на сегодняшний день.

Если нужно выделить одно самое главное слово, то .NET — это платформа либо экосистема. Платформа для создания ништяков — a platform for building stuff — как выразился Хансельман.

Старые версии (до 5.0) исторически называются .NET Framework

  • Done but not dead — не будет развиваться, но поддержка продолжается.
  • Windows only.
  • Proprietary software.
  • Установлен глобально в систему.
  • Web Forms остались здесь (и это хорошо)

Актуальные версии (начиная с 5.0) называются просто .NET

  • Cross platform: Linux, Mac, мобильные…
  • Open source, GitHub, MIT License.
  • Можно установить много версий на одну машину.
  • Чётные версии — LTS, long-term support.
  • Всё развитие здесь: новые фишки C#, обновления стандартных API, новые типы приложений (workloads), новые способы компиляции…

Стимулом для выхода в open source и отвязывания от Windows стал поворот трендов разработки в сторону облаков, контейнеров, микросервисов, мобильников, часов, умного дома и HTML5-приложений, упакованных в Electron. Ко всем этим сценариям .NET Framework оказался не готов, а попытки адаптации через создание новых собственных платформ провалились: Silverlight, Windows Phone, невостребованные Windows Containers.

Словосочетания .NET Core и .NET Standard использовались в переходный период 2014-2020 годов:

Ключевые компоненты .NET

В переходный период активно употребляли названия CoreCLR вместо CLR и CoreFX вместо BCL, чтобы подчеркнуть разницу между .NET Framework и .NET Core. Теперь эти слова сохраняются по большей части внутри исходников платформы. Снаружи стараются создать иллюзию ощущение единства, выводят из употребления лишние термины, убирают порождённую ими путаницу.

Подробнее про языки .NET

Краеугольный камень архитектуры .NET — это так называемая общеязыковая инфраструктура, Common Language Infrastructure. Если будете разбираться детально, то встретите немало сочетаний, начинающихся с “Common” — Common Type System, Common Language Specification, Common Intermediate Language…

Из наименований видно, что акцент делается на каком-то обобщении, и это неспроста.

Раньше, до появления .NET, Visual Studio была набором несвязанных IDE, каждая со своей аудиторией разработчиков, конкурентами и проблемами:

  • Visual Basic соперничал с Delphi за окна с кнопками и формами.
  • На Visual C++ писали системный и high-performance софт, а GUI делали на MFС.
  • Была своя Java под названием Visual J++, за которую Sun засудил Microsoft.
  • Была даже отдельная среда InterDev для классического ASP, у которого появились кросс-платформенные конкуренты PHP и Perl.

.NET обещал синергию между языками, типами приложений и стандартными библиотеками:

  • Поклонники Visual Basic, C++ и Java могли выбрать аналогичный (или хотя бы похожий) язык — VB.NET, C# или недолго продержавшийся J#,
  • и писать на каждом из них любые приложения — хоть кнопки/формы (причём даже под веб, remember Web Forms), хоть сервисы или консольные утилиты.
  • Каждому языку доступна общая библиотека стандартных классов, а разные части большого проекта можно программировать на разных языках, но в одной IDE.

Это сработало, и .NET Framework стал популярен. C# и Visual Basic занимали примерно равное положение. При создании любого нового проекта в Visual Studio можно было выбрать C# / VB.

Однако сегодня VB получает всё меньше внимания, а .NET и C# приближаются к тому, чтобы стать синонимами. Если изучить список шаблонов, выводимый командой dotnet new list, то будет видно, что VB доступен примерно для одной трети элементов.

Похоже, популяция энтузиастов Visual Basic, которую Microsoft взрастила на протяжении десятилетий, вымерла перестала бояться “нормальных” языков. Примерно так же, как в случае с JavaScript, которого долго сторонились, а потом распробовали.

Кроме C# и VB, ещё есть нишевый функциональный язык F#, а полный список насчитывает более 20 наименований.

Код на любом из .NET-языков называется управляемым (managed code), потому что он транслируется не в машинный код процессора, а в промежуточный байт-код Common Intermediate Language (CIL), который загружается и исполняется под управлением Common Language Runtime (CLR). Да, common и ещё раз common…

Артефакты компиляции, несмотря на то что выглядят как файлы .exe или .dll, являются так называемыми сборками (assemblies). Внутри них — CIL вместе с метаданными и ресурсами.

Особняком стоит C++/CLI, язык с нелёгкой судьбой. Позволяет делать смешанные сборки, Windows only.

CLR

Common Language Runtime, исполняющая среда.

  • Загружает сборки, ведёт учёт метаданных (типы, embedded resources).
  • Динамически транслирует СIL в машинный код конкретного процессора — JIT (just-in-time).
  • Автоматически управляет памятью — GC (garbage collector).
  • Управляет потоками (threads). В частности, умеет их приостанавливать по запросу от GC, чтобы тот смог освободить неиспользуемую память.
  • Реализует необходимый минимум типов и функций — System.Private.CoreLib.
  • Следит за безопасностью кода и памяти — совместимость типов, границы массивов.
  • Предоставляет инфраструктуру для исключений (exceptions), взаимодействия с неуправляемым кодом (P/Invoke), отладчиков, профайлеров и “многое другое”.

Инструменты / SDK

  • IDE — Visual Studio, VS Code.
  • MSBuild — система описания и сборки проектов (csproj и др.)
  • NuGet — реестр и менеджер сторонних библиотек.
  • dotnet — утилита для работы в консоли.

Native AOT (ahead of time)

Начиная с .NET 7, можно скомпилировать программу в самодостаточный нативный бинарник, в том числе под Linux и Mac. Ну почти как на Go.

Вместе с развитием AOT-компиляции растёт использование генераторов (source generators) вместо runtime reflection, который оказывается ограничен.

Mono, Xamarin, Unity?

Сегодня это всё попадает под широкий зонт понятия “платформа .NET”.

Microsoft купил Xamarin в 2016 году вместе с Mono и его автором (который от них уже сбежал). Сначала Xamarin встроили в Visual Studio, а позже растворили в новом фреймворке MAUI.

Про MAUI нашёл красноречивую цитату:

One of the things we don’t want to do is to build new UI stacks. So MAUI is a wrapper around existing UI stacks. Our days of trying to make UI stacks are over.

If you’re on Windows it wraps WinUI, if you’re on Mac it wraps the Catalyst tech which lets you build an app that runs on the Mac and iOS, and on Android it wraps native Android… MAUI is an abstraction on top of all the UI stacks.

Unity — отдельная среда для игр и всякой визуализации. В ней .NET используется для скриптов, а Visual Studio подключается как внешний редактор. Разработчики Unity пишут:

We want to build on top of the .NET ecosystem instead of developing custom solutions. We want to migrate from the Mono Runtime to the modern .NET Runtime.

На Reddit спекулируют, что и их Microsoft проглотит.

Забавные факты о названии

  • Слово .NET уходит корнями в стратегию начала 2000-х, когда маркетологи Microsoft собрались добавлять этот суффикс во все места. Даже хотели винду назвать Windows .NET Server.

    Ребрендинг совпал по времени с релизом нового фреймворка (рабочее название которого было Common Object Runtime, COR). Так и возникло сочетание .NET Framework. В итоге только оно и прижилось, а другие продукты загнулись или были переименованы.

  • Даже говорящие головы из MS согласны, что название так себе:

    Вторая цитата особенно хороша, потому что .net — это действительно top-level domain, но есть один нюанс 😃

  • “I was a dev at Microsoft at the time, and I have no idea whose ass the name .NET was pulled from” — StackOverflow

В очередной раз убеждаемся, naming things is hard.