# Развитие .NET

.NET 7, .NET Core, .NET Framework и Xamarin - это родственные и пересекающиеся платформы для разработчиков, используемые для создания приложений и служб. В этом разделе я познакомлю вас с каждой из этих концепций .NET.

## .NET Framework

.NET Framework - это платформа разработки, которая включает в себя Common Language Runtime (CLR), управляющую выполнением кода, и Base Class Library (BCL), предоставляющую богатую библиотеку классов для создания приложений.

Изначально Microsoft разработала .NET Framework с учетом возможности быть кроссплатформенным, но впоследствии Microsoft направила свои усилия на то, чтобы он лучше всего работал с Windows.

Начиная с .NET Framework 4.5.2, он является официальным компонентом операционной системы Windows. Компоненты имеют такую же поддержку, как и их родительские продукты, поэтому 4.5.2 и более поздние версии следуют политике жизненного цикла ОС Windows, на которой они установлены. .NET Framework установлен на более чем миллиард компьютеров, поэтому он должен меняться как можно реже. Даже исправления ошибок могут вызвать проблемы, поэтому он практически не обновляется.

Для .NET Framework 4.0 или более поздней версии все приложения на компьютере, написанные для .NET Framework, используют одну и ту же версию CLR и библиотек, хранящихся в Global Assembly Cache (GAC), что может привести к проблемам, если некоторым из них для совместимости требуется определенная версия.

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2F0DU3ufpojn6Na3pDX162%2Fimage.png?alt=media&#x26;token=f279400d-be69-4a3d-bcb3-9ba961880255" alt=""><figcaption></figcaption></figure>

## Проекты Mono, Xamarin и Unity

Специалисты сторонних компаний разработали реализацию .NET Framework, названную проектом Mono. Mono является кроссплатформенным, но он отстает от официальной реализации .NET Framework.

Mono нашла свою нишу в качестве основы мобильной платформы Xamarin, а также кросс-платформенных платформ для разработки игр, таких как Unity.

Microsoft приобрела Xamarin в 2016 году и теперь бесплатно отдает вместе с Visual Studio то, что раньше было дорогим расширением Xamarin. Microsoft переименовала инструмент разработки в Xamarin Studio, который мог создавать только мобильные приложения, в Visual Studio для Mac, и дала ему возможность создавать другие типы проектов, такие как консольные приложения и веб-сервисы таких проектов, как консольные приложения и веб-сервисы.

В Visual Studio 2022 для Mac компания Microsoft заменила некоторые моменты редактора Xamarin Studio на элементы из Visual Studio 2022 для Windows, чтобы обеспечить более близкое соответствие опыта и производительности. Visual Studio 2022 для Mac также была переписана, чтобы стать действительно родным приложением с пользовательским интерфейсом macOS для повышения надежности и работы со встроенными вспомогательными технологиями macOS.

## .NET Core

Сегодня мы живем в действительно кроссплатформенном мире, где современные мобильные и облачные разработки сделали Windows как операционную систему гораздо менее важной. В связи с этим компания Microsoft с 2015 года работает над тем, чтобы отделить .NET от тесной связи с Windows. Переписывая .NET Framework, чтобы сделать его действительно кроссплатформенным, компания воспользовалась возможностью рефакторинга и удаления основных частей, которые больше не считаются базовыми.

Этот новый модернизированный продукт был первоначально назван .NET Core и включал в себя кроссплатформенную реализацию CLR, известную как CoreCLR, и усовершенствованный BCL, известный как CoreFX.

Скотт Хантер, руководитель программы Microsoft Partner Director по .NET, заявил: "Сорок процентов наших клиентов .NET Core - это совершенно новые пользователи платформы, чего мы и хотим от .NET Core. Мы хотим привлечь новых людей".

.NET Core стремительно развивается, и поскольку он совместим со многими приложениями, его можно часто менять, зная, что эти изменения не повлияют на другие приложения.NET Core в той же системе. Большинство улучшений, которые Microsoft вносит в .NET Core и современный .NET, не могут быть легко добавлены в .NET Framework.

## Развитие на пути к единому .NET

На конференции разработчиков Microsoft Build в мае 2020 года команда разработчиков .NET объявила, что их планы по объединению .NET были отложены. Они сообщили, что .NET 5 будет выпущен 10 ноября 2020 года и объединит все различные платформы .NET, кроме мобильных. И только после выхода .NET 6 в ноябре 2021 года мобильные устройства также будут поддерживаться единой платформой. К сожалению, в сентябре 2021 года им пришлось объявить о шестимесячной задержке выпуска .NET MAUI, новой кросс-платформенной платформы для разработки мобильных и настольных приложений. Наконец, в мае 2022 года .NET MAUI была выпущена в стадии General Availability (GA). Вы можете прочитать объявление по следующей ссылке:

{% embed url="<https://devblogs.microsoft.com/dotnet/introducing-dotnet-maui-one-codebase-manyplatforms/>" %}

.NET Core был переименован в .NET, а номер основной версии был изменен на 4, чтобы избежать путаницы с .NET Framework 4.x. Microsoft планирует выпускать новые версии ежегодно в ноябре, примерно как Apple выпускает новые версии iOS в сентябре.

В следующей таблице показано, когда были выпущены версии современного .NET, когда планируются будущие выпуски, и какая версия используется в опубликованных изданиях этой книги:

<table data-header-hidden><thead><tr><th width="298"></th><th width="156"></th><th width="119"></th><th></th></tr></thead><tbody><tr><td>Версия</td><td>Выпуск</td><td>Издание</td><td>Публикация</td></tr><tr><td>.NET Core RC1</td><td>Ноябрь 2015</td><td>Первое</td><td>Март 2016</td></tr><tr><td>.NET Core 1.0</td><td>Июнь 2016</td><td> </td><td> </td></tr><tr><td>.NET Core 1.1</td><td>Ноябрь 2016</td><td> </td><td> </td></tr><tr><td>.NET Core 1.0.4 and .NET Core 1.1.1</td><td>Март 2017</td><td>Второе</td><td>Март 2017</td></tr><tr><td>.NET Core 2.0</td><td>Август 2017</td><td> </td><td> </td></tr><tr><td>.NET Core for UWP in Windows 10 Fall Creators Update</td><td>Октябрь 2017</td><td>Третье</td><td>Ноябрь 2017</td></tr><tr><td>.NET Core 2.1 (LTS)</td><td>Май 2018</td><td> </td><td> </td></tr><tr><td>.NET Core 2.2 (Current)</td><td>Декабрь 2018</td><td> </td><td> </td></tr><tr><td>.NET Core 3.0 (Current)</td><td>Сентябрь 2019</td><td>Четвертое</td><td>Октябрь 2019</td></tr><tr><td>.NET Core 3.1 (LTS)</td><td>Декабрь 2019</td><td> </td><td> </td></tr><tr><td>Blazor WebAssembly 3.2 (Current)</td><td>Май 2020</td><td> </td><td> </td></tr><tr><td>.NET 5.0 (Current)</td><td>Ноябрь 2020</td><td>Пятое</td><td>Ноябрь 2020</td></tr><tr><td>.NET 6.0 (LTS)</td><td>Ноябрь 2021</td><td>Шестое</td><td>Ноябрь 2021</td></tr><tr><td>.NET 7.0 (Standard)</td><td>Ноябрь 2022</td><td>Седьмое</td><td>Ноябрь 2022</td></tr><tr><td>.NET 8.0 (LTS)</td><td>Ноябрь 2023</td><td>Восьмое</td><td>Ноябрь 2023</td></tr><tr><td>.NET 9.0 (Standard)</td><td>Ноябрь 2024</td><td>Девятое</td><td>Ноябрь 2024</td></tr><tr><td>.NET 10.0 (LTS)</td><td>Ноябрь 2025</td><td>Десятое</td><td>Ноябрь 2025</td></tr></tbody></table>

## Blazor WebAssembly

.NET Core 3.1 включал Blazor Server для создания веб-компонентов. Microsoft также планировала включить Blazor WebAssembly в эту же версию .NET Core, но это было отложено. Позже Blazor WebAssembly был выпущен в качестве дополнения для .NET Core 3.1. Я включил ее в таблицу выше, поскольку она была обозначена версией 3.2, чтобы исключить ее из LTS .NET Core 3.1.

## Поддержка технологии .NET

Выпуски .NET являются либо долгосрочной поддержкой (LTS), либо стандартной поддержкой (Standart), ранее известной как текущая(Current), либо предварительной версией (Preview), как описано в следующем списке:

* Выпуски **LTS** стабильны и требуют меньшего количества обновлений в течение всего срока службы. Это хороший выбор для приложений, которые вы не собираетесь часто обновлять. Выпуски LTS поддерживаются Microsoft в течение 3 лет после общей доступности или 1 года после поставки следующего выпуска LTS, в зависимости от того, какой из этих сроков истекает.
* **Standard** или **Current** выпуски включают функции, которые могут быть изменены на основе полученной обратной связи. Это хороший выбор для приложений, которые вы активно разрабатываете, поскольку они обеспечивают доступ к последним улучшениям. Стандартные выпуски поддерживаются Microsoft в течение 18 месяцев после или 6 месяцев после выхода следующего выпуска Standard или LTS, в зависимости от того, какой срок больше.
* **Preview** выпуски предназначены для публичного тестирования. Они являются хорошим выбором для программистов-авантюристов, которые хотят жить на передовой, или авторов книг по программированию, которым необходим ранний доступ к новым возможностям языка, библиотекам и платформам приложений. Релизы Preview не поддерживаются Microsoft, но релизы Preview или релизы Candidate (RC) могут быть объявлены в качестве Go Live, что означает, что они поддерживаются в производстве Microsoft.

Standard и LTS получают важнейшие исправления в течение всего срока службы для обеспечения безопасности и надежности. Для получения поддержки необходимо обновлять систему за счет новейших исправлений. Например, если система работает под управлением 1.0.0 и выпущена версия 1.0.1, то для получения поддержки необходимо установить версию 1.0.1.

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2Fe20kXPqw248mUUH1wwA3%2Fimage.png?alt=media&#x26;token=3f8a3405-efa6-4531-84a1-37dfba5c8845" alt=""><figcaption></figcaption></figure>

Чтобы лучше понять выбор между Standard (он же Current) и LTS выпусками, полезно увидеть его визуально: черные полосы длиной по 3 года для LTS выпусков и серые полосы разной длины для Standard/Current выпусков, которые заканчиваются перекрестной штриховкой в течение 6 месяцев после нового крупного или мелкого выпуска, поддержка которого еще продолжается, как показано на рисунке 1.2:

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2FnKLjdfsZrd7O2izt6E1q%2Fimage.png?alt=media&#x26;token=17e7f8a9-dfec-42f6-924a-e0b7359f3d9c" alt=""><figcaption><p>Рисунок 1.2: Длительность поддержки для релизов Standard и LTS</p></figcaption></figure>

Например, если вы создали проект с использованием .NET 5.0, то когда компания Microsoft выпустила .NET 6.0 8 ноября 2021 года, вы должны были обновить свой проект до .NET 6.0 до 8 мая 2022 года, если вы хотели получать исправления и обновления и пользоваться поддержкой Microsoft.

Если вам нужна долгосрочная поддержка от Microsoft, то выбирайте .NET 6.0 и пользуйтесь им до .NET 8.0, даже если Microsoft выпустила .NET 7.0. Это связано с тем, что .NET 7.0 - это выпуск Standard, и поэтому он потеряет поддержку раньше, чем .NET 6.0. Помните, что даже при выпуске LTS вы должны обновляться до выпусков с исправленными ошибками, таких как .NET 6.0.9 и .NET SDK 6.0.401, которые были выпущены 13 сентября 2022 года, поскольку обновления выходят каждый месяц.

На момент публикации в ноябре 2022 года все версии .NET Core и современного .NET достигли конца срока службы, кроме тех, которые представлены в следующем списке, упорядоченном по датам окончания срока эксплуатации:

* .NET Core 3.1 достигнет конца срока службы 13 декабря 2022 года.
* Срок службы .NET 7.0 истекает 14 мая 2024 года.
* Срок службы .NET 6.0 истекает 12 ноября 2024 года.

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2FjWOjuZhej7JMCTs3LPAW%2Fimage.png?alt=media&#x26;token=8b952b09-dcd6-4e9f-a74e-7280c17cd85d" alt=""><figcaption></figcaption></figure>

## Версии .NET Runtime и .NET SDK

Версии NET Runtime следуют семантической версионности, то есть, основные изменения (major increment) указывают на изменения, приводящие к взлому, минорные инкременты указывают на новые возможности, а инкременты патчей указывают на исправление ошибок.

Версия .NET SDK не следует семантической версионности. Номера major(Основной) и minor(второстепенной) версии привязаны к версии runtime, с которой он сопоставлен. Номер патча следует соглашению, которое указывает на major и minor версии SDK.

Пример этого можно увидеть в следующей таблице:

<table data-header-hidden><thead><tr><th width="340"></th><th width="210.33333333333331"></th><th></th></tr></thead><tbody><tr><td><strong>Изменения</strong></td><td><strong>Runtime</strong></td><td><strong>SDK</strong></td></tr><tr><td>Первый релиз</td><td>7.0.0</td><td>7.0.100</td></tr><tr><td>Исправление ошибок SDK</td><td>7.0.0</td><td>7.0.101</td></tr><tr><td>исправление ошибок Runtime и SDK</td><td>7.0.1</td><td>7.0.102</td></tr><tr><td>Новые функции SDK</td><td>7.0.1</td><td>7.0.200</td></tr></tbody></table>

## Установка и удаление версий .NET

Обновления .NET Runtime совместимы с основной(major) версией, такой как 7.x, а обновленные выпуски .NET SDK сохраняют возможность создания приложений, ориентированных на предыдущие версии runtime, что позволяет безопасно удалять старые версии.

Вы можете посмотреть, какие SDK и runtime версии установлены в настоящее время, используя следующие команды:

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2F53xFUMmr2GiR8TDLBvzr%2Fimage.png?alt=media&#x26;token=0325dcb4-8c8c-4787-b038-7502dd26cdc8" alt=""><figcaption></figcaption></figure>

В Windows используйте раздел Apps & features для удаления .NET SDKs.&#x20;

В macOS или Windows используйте инструмент dotnet-core-uninstall. Этот инструмент не установлен по умолчанию.&#x20;

Например, во время написания четвертого издания я каждый месяц использовал следующую команду:

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2FPnzJ8RudJxSOXmsUrUeq%2Fimage.png?alt=media&#x26;token=d4148185-8606-463b-af9e-329d154f3fbf" alt=""><figcaption></figcaption></figure>

## Чем отличается современный .NET?

Современный .NET является модульным по сравнению с устаревшим .NET Framework, который является монолитным. Он имеет открытый исходный код, и Microsoft принимает решения об улучшениях и изменениях в открытом доступе. Microsoft приложила особые усилия для повышения производительности современного .NET.

Он может казаться меньше, чем последняя версия .NET Framework, из-за удаления устаревших и некроссплатформенных технологий. Например, такие рабочие нагрузки, как **Windows Forms** и **Windows Presentation Foundation** (WPF), могут использоваться для создания приложений с **graphical user interface** (GUI), но они тесно связаны с экосистемой Windows, поэтому и не включены в .NET на macOS и Linux.

## Windows desktop разработка

Одной из особенностей современного .NET является поддержка запуска старых настольных приложений Windows Forms и WPF с помощью Windows Desktop Pack, который входит в Windows-версию .NET Core 3.1 или более позднюю. Именно поэтому он больше, чем SDK для macOS и Linux. Вы можете внести изменения в свое устаревшее настольное приложение Windows, а затем перестроить его под современный .NET, чтобы воспользоваться новыми возможностями и повысить производительность. В этой книге я не охватываю разработку desktop Windows.

## Веб-разработка

ASP.NET Web Forms и **Windows Communication Foundation (WCF)** - это старые технологии веб-приложений и сервисов, которые сегодня все меньше разработчиков предпочитают использовать для новых проектов, поэтому они также были удалены из современного .NET. Вместо них разработчики предпочитают использовать ASP.NET MVC, ASP.NET Web API, SignalR и gRPC. Эти технологии были доработаны и объединены в платформу, которая работает на современном .NET и называется **ASP.NET Core**.

Вы узнаете о технологиях веб-разработки в главе 12 "Введение в веб-разработку с помощью ASP.NET Core", главе 13 "Создание веб-сайтов с помощью ASP.NET Core Razor Pages", главе 14 "Создание веб-сайтов с помощью паттерна Model-View-Controller", главе 15 "Создание и потребление веб-служб" и главе 16 "Создание пользовательских интерфейсов с помощью Blazor".

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2FUb7KFkx6fPAgcZ6oE1CZ%2Fimage.png?alt=media&#x26;token=95a6fb1d-e451-4f55-ad70-10b96848ca80" alt=""><figcaption></figcaption></figure>

## Разработка баз данных

**Entity Framework (EF)** 6 - это технология объектно-реляционного отображения, предназначенная для работы с данными, которые хранятся в реляционных базах данных, таких как Oracle и SQL Server. С годами она обросла множеством ошибок, поэтому кроссплатформенный API был урезан и получил поддержку нереляционных баз данных, таких как Azure Cosmos DB, и был переименован в **Entity Framework Core**.

Вы узнаете об этом в главе 10, Работа с данными с помощью Entity Framework Core.&#x20;

Если у вас есть существующие приложения, использующие старый EF, то версия 6.3 поддерживается на .NET Core 3.0 или более поздней версии.

## .NET Standart

Ситуация с .NET в 2019 году была такова, что существовало три развитых платформы .NET, контролируемых Microsoft, что показано в следующем списке:

* .NET Core: Для кроссплатформенных и новых приложений.
* .NET Framework: Для устаревших приложений.
* Xamarin: Для мобильных приложений.

У каждой из них были сильные и слабые стороны, поскольку все они были разработаны для разных ситуаций. Это привело к тому, что разработчику пришлось изучать три платформы, каждая из которых имела раздражающие недостатки и ограничения.

В связи с этим компания Microsoft определила .NET Standard - спецификацию набора API, которая могжет быть реализована всеми платформами .NET для указания уровня их совместимости. Например, базовая поддержка означает, что платформа совместима с .NET Standard 1.4.

В .NET Standard 2.0 и более поздних версиях Microsoft заставила все три платформы сойтись на современном минимальном стандарте, что значительно облегчило разработчикам обмен кодом между любыми версиями .NET.

Для .NET Core 2.0 и более поздних версий добавлено большинство недостающих API, необходимых разработчикам для переноса старого кода, написанного для .NET Framework, на кроссплатформенный .NET Core. Тем не менее, некоторые API реализованы, но вызывают исключение, указывающее разработчику на то, что на самом деле их не следует использовать! Обычно это связано с различиями в операционной системе, на которой вы запускаете .NET. Вы узнаете, как обрабатывать эти специфические для платформы исключения в главе 2, " Говорить на C#".

Важно понимать, что .NET Standard - это всего лишь один из стандартов. Вы не можете просто установить .NET Standard так же, как не можете установить HTML5. Чтобы использовать HTML5, необходимо установить веб-браузер, который реализует стандарт HTML5.

Чтобы использовать .NET Standard, необходимо установить платформу .NET, которая реализует спецификацию .NET Standard. Последний .NET Standard, версия 2.1, реализован в .NET Core 3.0, Mono и Xamarin. Некоторые функции C# 8.0 требуют .NET Standard 2.1. .NET Standard 2.1 не реализованных в .NET Framework 4.8.

С выходом .NET 5 и более поздних версий необходимость в .NET Standard значительно снизилась, поскольку теперь существует единый .NET для всех платформ, включая мобильные. Современный .NET имеет единый BCL и два CLR: CoreCLR оптимизирован для серверных или настольных решений, таких как веб-сайты и настольные приложения Windows, а Mono runtime оптимизирована для мобильных приложений и приложений для веб-браузеров, имеющих ограниченные ресурсы.

В августе 2021 года Стивен Тоуб ( инженер программного обеспечения, .NET) написал статью "Улучшение производительности в .NET 6". В ней есть раздел о Blazor и Mono, где он написал:

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2Ftl954pbP4S4MhIYczP3p%2Fimage.png?alt=media&#x26;token=5faf49fd-e5fb-4f2d-a079-85a27f877896" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2Fk7SXURqRjaV5X4cAMYCx%2Fimage.png?alt=media&#x26;token=7b3a7716-bf54-4641-a837-769f56f637ea" alt=""><figcaption></figcaption></figure>

Даже сейчас приложения и веб-сайты, созданные для .NET Framework, нуждаются в поддержке, поэтому важно понимать, что вы можете создавать библиотеки классов .NET Standard 2.0, которые обратно совместимы с устаревшими платформами .NET.

<figure><img src="https://1631334160-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZjhcdlR9XYnkbgp6RxyW%2Fuploads%2FW1em7KmyJ1boJdVOLEEw%2Fimage.png?alt=media&#x26;token=1145ae01-1a0b-487d-ad3e-63823c252e16" alt=""><figcaption></figcaption></figure>
