Компания Microsoft представила значительный выпуск открытой платформы .NET 7, созданной благодаря унификации продуктов .NET Framework, .NET Core и Mono. На основе .NET 7 можно создавать многоплатформенные приложения для браузера, облачных систем, рабочего стола, IoT-устройств и мобильных платформ, используя единые библиотеки и общий процесс сборки, не зависящий от типа приложения. Сборки .NET SDK 7, .NET Runtime 7 и ASP.NET Core Runtime 7 сформированы для Linux, macOS и Windows. .NET Desktop Runtime 6 поставляется только для Windows. Связанные с проектом наработки распространяются под лицензией MIT. Сопровождение ветки .NET 7 будут осуществляться в течение 18 месяцев до 14 мая 2024 года.
В состав .NET 7 входит runtime CoreCLR с JIT-компилятором RyuJIT, стандартные библиотеки, библиотеки CoreFX, WPF, Windows Forms, WinUI, Entity Framework, интерфейс командной строки dotnet, а также инструменты для разработки микросервисов, библиотек, серверных, графических и консольных приложений. Отдельно опубликованы стек для разработки web-приложений ASP.NET Core 7.0, ORM-прослойка Entity Framework Core 7.0 (драйверы имеются, в том числе, для SQLite и PostgreSQL), библиотека WPF 7 (Windows Presentation Foundation), фреймворк Windows Forms 7 для разработки GUI, платформа Orleans 7 для создания приложений Cloud Native, фреймворк MAUI 7 для разработки многоплатформенных интерфейсов пользователя, а также выпуски языков C# 11 и F# 7. Поддержка .NET 7.0 и C# 11 включена в свободный редактор кода Visual Studio Code.
Особенности нового выпуска:
- Проведена унификация базовой библиотеки классов (BCL, Base Class Library) для использования в различных типах приложений, включая программы для настольных систем, web-приложений, облачных платформ, мобильных приложений, игр, встраиваемых программ и систем машинного обучения. Для разработки различных типов приложений можно использовать один общий SDK, Runtime и набор библиотек.
- Предоставлена возможность привязки приложения к API, соответствующему выпуску .NET 7, через определение целевой платформы “net7.0”, например,
“net7.0”. Для привязки к специфичным для каких-то платформ API при определении цели можно детализировать тип платформы, например, указав “net7.0-android”. - Значительно улучшена поддержка архитектуры ARM64 и продолжена работа по достижению паритета в производительности приложений .NET при выполнении на архитектурах x86 и ARM64. В runtime повышена эффективность использования кэша третьего уровня на системах ARM64. Задействованы инструкции LSE для разграничения доступа к памяти из параллельных потоков, что привело к снижению задержек на 45%. В библиотеке добавлены обработчики, использующие векторные типы Vector64, Vector128 и Vector256, а также на базе векторных инструкций переписаны функции EncodeToUtf8 и DecodeFromUtf8, что обеспечило увеличение их производительности до 60% (для функций NarrowUtf16ToAscii и GetIndexOfFirstNonAsciiChar прирост производительности достигает 35%). В целом скорость прохождение тестов на платформе ARM64 выросла на 10-60%.
- Улучшена поддержка платформы Linux, в том числе в штатные репозитории Ubuntu 22.04 добавлены пакеты с .NET 6 и предоставлен оптимизированный, компактный и готовый к использованию docker-образ для быстрого развёртывания контейнеров с приложениями на базе .NET.
- Добавлена поддержка 64-разрядной архитектуры IBM Power (ppc64le).
- Предложен инструментарий .NET Upgrade Assistant для упрощения перевода старых приложений на ветки .NET 6 или .NET 7. В новой версии расширена поддержка миграции приложений с ASP.NET на ASP.NET Core, добавлены анализаторы и корректировщики кода для WinForms, WPF и библиотеки классов, реализована поддержка анализа исполняемых файлов, добавлена поддержка платформы UWP (Universal Windows Platform).
- Расширены возможности по созданию приложений для облачных систем (cloud-native) и платформ PaaS (платформа как услуга). Предоставлена возможность создания приложений, упакованных в изолированные контейнеры, при помощи команды “dotnet publish”.
- Расширены средства для отслеживания состояния приложений и сбора метрик об их работе. Добавлены новые события и методы для анализа активности и производительности приложения.
- В языке C# 11 добавлена поддержка необработанных строковых литералов, которые могут включать спецсимволы без необходимости их экранирования (подобные литералы выделяются тремя кавычками). Предложены обобщённые интерфейсы (generic) для математических функций и предоставлена возможность определения статических элементов в виртуальных интерфейсах, что позволило применить методы обобщённого программирования для выполнения математических операций без точной информации о типе значений.
- Расширены возможности стандартной библиотеки. Добавлен API System.Formats.Tar для работы с архивами в формате Tar. В функции работы со временем (TimeStamp, DateTime и т.п.) добавлена поддержка микросекунд и наносекунд. В System.Text.Json реализована возможность управления сериализацией и десериализацией типов .NET.
- В интерфейсе командной строки “dotnet new” добавлена поддержка автодополнения шаблонов типовых проектов через нажатие клавиши Tab.
- В .NET SDK реализована возможность ограничения применения поставляемых шаблонов проектов, например, можно определить в каких операционных системах допустим шаблон.
- В NuGet добавлен режим централизованного управления пакетами, позволяющий управлять зависимостями сразу для нескольких проектов.
- Повышена производительность JIT-компилятора. Добавлена поддержка механизма OSR (On Stack Replacement) для изменения кода уже выполняемых методов, что позволяет вносить оптимизации в методы, выполнение которых занимает много времени, не дожидаясь завершения текущего вызова (в тесте TechEmpower отмечается повышение производительности обработки первых запросов на 10-30%).
- Повышена эффективность оптимизации на основе результатов профилирования кода (PGO – Profile-guided optimization), позволяющей учитывать особенности, определяемые во время выполнения программы.
- Добавлена поддержка компиляции в самодостаточные исполняемый файлы (Native AOT), в которых весь проект изначально скомпилирован в машинный код целевой платформы без использования промежуточного кода и без применения JIT.