.net framework

Улучшения в Preview 1

Улучшение качества кода в RyuJIT

  • Улучшения для фолдинга null checks – Удалите необходимость генерировать null checks в большем количестве случаев, наблюдая больше шаблонов, где null checks, вероятно, не нужны.
  • Настройка общего подвыражения (CSE) – JIT ищет и сворачивает дублирующиеся выражения, которые нужно оценивать только один раз.
  • Оптимизация «constant_string».Length – Оптимизация этого шаблона и свертывание кода до правильного целочисленного значения.
  • JIT: создание базовых списков блоков перед морфингом – Переупорядочевание фазы в JIT, чтобы раньше можно было использовать ключевые оптимизации, что привело к лучшему качеству кода и меньшему количеству работы для следующих фаз, что увеличивает пропускную способность JIT («TP» в ссылочном PR).

Консолидация репозиториев GitHub

сократили количество репозиториев на GitHub

  • dotnet/runtime (были dotnet/corefx, dotnet/coreclr, и dotnet/core-setup)
  • dotnet/aspnetcore (было множество репозиториев в aspnet org)
  • dotnet/sdk (были dotnet/sdk, dotnet/cli)

Для чего нужен .NET

Обычным пользователям может показаться, что это какие-то программистские штуки, которые никак не влияют на их жизнь. На самом деле в этом есть смысл и для них.


Если бы не .NET, пользователям пришлось бы устанавливать среду исполнения для программ на каждом языке. То есть чтобы запустить приложение на Visual Basic, нужно скачать среду выполнения для Visual Basic. Если же программа написана на C#, то придётся скачивать среду и для неё.

Это очень быстро забьёт всё место на компьютере немного отличающимися копиями одних и тех же библиотек.

Для программистов это тоже важно, потому что даёт возможность развивать одну среду, которая используется сразу для четырёх языков. Иначе обычным разработчикам приходилось бы ждать, пока выйдет новая версия библиотек для их языка

Менее популярные языки, вроде F#, получали бы обновление намного позже C#.

Кроме основных языков есть также и другие, которые поддерживаются .NET. Среди них COBOL, Fortran, Haskell и даже Java — вы можете ознакомиться с полным списком.

.NET Framework для пользователейThe .NET Framework for users

Если вы не разрабатываете приложения .NET Framework, но используете их, вам не требуется обладать специальными знаниями о платформе .NET Framework или ее работе.If you don’t develop .NET Framework apps, but you use them, you aren’t required to have specific knowledge about .NET Framework or its operation. В большинстве случаев платформа .NET Framework совершенно прозрачна для пользователей.For the most part, the framework is completely transparent to users.

Если используется операционная система Windows, платформа .NET Framework, возможно, уже установлена на компьютере.If you’re using the Windows operating system, .NET Framework may already be installed on your computer. Кроме того, если устанавливается приложение, для работы которого требуется .NET Framework, программа установки приложения может установить нужную версию .NET Framework на компьютер.In addition, if you install an app that requires .NET Framework, the app’s setup program might install a specific version of the framework on your computer. В некоторых случаях отображается диалоговое окно с приглашением установить платформу .NET Framework.In some cases, you may see a dialog box that asks you to install .NET Framework. Если вы попытались запустить приложение и появилось это окно, при наличии подключения к Интернету можно перейти на веб-страницу, откуда можно установить отсутствующую версию .NET Framework.If you’ve just tried to run an app when this dialog box appears and if your computer has internet access, you can go to a webpage that lets you install the missing version of .NET Framework. Дополнительные сведения см. в руководстве по установке.For more information, see the Installation guide.

В общем случае не рекомендуется удалять версии платформы .NET Framework, установленные на компьютере.In general, you shouldn’t uninstall versions of .NET Framework that are installed on your computer. Для этого имеются две причины:There are two reasons for this:

  • Если приложение зависит от конкретной версии платформы .NET Framework, то при удалении этой версии его работа может быть нарушена.If an app that you use depends on a specific version of .NET Framework, that app may break if that version is removed.

  • В некоторых версиях платформы .NET Framework существуют обновления на месте на более ранние версии.Some versions of .NET Framework are in-place updates to earlier versions. Например, .NET Framework 3.5 представляет собой обновление на месте для версии 2.0, а .NET Framework 4.8 — обновление на месте для версий с 4 по 4.7.2.For example, .NET Framework 3.5 is an in-place update to version 2.0, and .NET Framework 4.8 is an in-place update to versions 4 through 4.7.2. Дополнительные сведения см. в разделе Платформа.NET Framework: версии и зависимости.For more information, see .NET Framework Versions and Dependencies.

Если вы решите удалить платформу .NET Framework в версии Windows, предшествующей Windows 8, всегда используйте для удаления средство Программы и компоненты.On Windows versions before Windows 8, if you do choose to remove .NET Framework, always use Programs and Features from Control Panel to uninstall it. Никогда не удаляйте версию платформы .NET Framework вручную.Never remove a version of .NET Framework manually. В ОС Windows 8 и более поздних версий .NET Framework представляет собой компонент операционной системы, который нельзя удалить отдельно.On Windows 8 and above, .NET Framework is an operating system component and cannot be independently uninstalled.

На одном компьютере могут одновременно существовать несколько версий платформы .NET Framework.Multiple versions of .NET Framework can coexist on a single computer at the same time. То есть при установке более поздних версий удалять предыдущие версии не требуется.This means that you don’t have to uninstall previous versions in order to install a later version.

Диспетчер middleware

Чтобы наше приложение стало работать с каким-либо промежуточным слоем, нам понадобится диспетчер.

PSR-15 — это стандарт, определяющий интерфейсы для middleware и диспетчеров (в спецификации они называются «обработчики запросов»), обеспечивающий взаимосовместимость широкого спектра решений. Нам лишь нужно выбрать диспетчер, совместимый с PSR-15, и он будет работать с любым совместимым middleware.

В качестве диспетчера установим Relay.

А поскольку спецификация PSR-15 подразумевает, чтобы реализация промежуточного слоя передавала HTTP-сообщения, совместимые с PSR-7, мы воспользуемся Zend Diactoros.

Подготовим Relay к приёму промежуточных слоев.

В строке 16 мы с помощью будем и передачи его . Здесь запрос попадает в стек промежуточных слоев.

Теперь добавим и обработчика запросов ( определяет, валиден ли запрос и может ли он быть обработан нашим приложением, а обработчик запросов передаёт запрос тому обработчику, что сконфигурирован для этого маршрута).

А теперь определим маршрут для класса обработчика Hello, world!.. Здесь мы воспользуемся маршрутом , чтобы продемонстрировать возможность использования маршрута, отличающегося от базового URI.

Чтобы всё заработало, нужно обновить , сделав его вызываемым классом, то есть чтобы этот класс можно было вызвать как функцию.

Обратите внимание на добавленный в магическом методе. Скоро вы поймёте, к чему это

Теперь откройте http://localhost:8080/hello и наслаждайтесь своим успехом!

Remarks for version 4.5 and later

.NET Framework 4.5 is an in-place update that replaces .NET Framework 4 on your computer, and similarly, .NET Framework 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, and 4.8 are in-place updates to .NET Framework 4.5. In-place update means that they use the same runtime version, but the assembly versions are updated and include new types and members. After you install one of these updates, your .NET Framework 4, .NET Framework 4.5, .NET Framework 4.6, or .NET Framework 4.7 apps should continue to run without requiring recompilation. However, the reverse is not true. We do not recommend running apps that target a later version of .NET Framework on an earlier version. For example, we do not recommend that you run an app the targets .NET Framework 4.6 on .NET Framework 4.5.

The following guidelines apply:

  • In Visual Studio, you can choose .NET Framework 4.5 as the target framework for a project (this sets the GetReferenceAssemblyPaths.TargetFrameworkMoniker property) to compile the project as a .NET Framework 4.5 assembly or executable. This assembly or executable can then be used on any computer that has the .NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, or 4.8 installed.

  • In Visual Studio, you can choose .NET Framework 4.5.1 as the target framework for a project to compile it as a .NET Framework 4.5.1 assembly or executable. Only run this assembly or executable on computers that have .NET Framework 4.5.1 or later installed. An executable that targets .NET Framework 4.5.1 will be blocked from running on a computer that only has an earlier version of .NET Framework, such as .NET Framework 4.5, installed. The user will be prompted to install .NET Framework 4.5.1. In addition, .NET Framework 4.5.1 assemblies should not be called from an app that targets an earlier version of .NET Framework, such as .NET Framework 4.5.

    Note


    .NET Framework 4.5.1 and .NET Framework 4.5 are used here only as examples. The principle described applies to any app that targets a later version of .NET Framework than the one installed on the system on which it’s running.

Some changes in .NET Framework may require changes to your app code; see Application Compatibility before you run your existing apps with .NET Framework 4.5 or later versions. For more information about installing the current version, see Install the .NET Framework for developers. For information about support for the .NET Framework, see .NET Framework official support policy on the .NET website.

Контроллер запросов

Вооружившись этим знанием, начнём с фронт-контроллера. Он представляет собой PHP-файл, обрабатывающий все запросы к вашему приложению. То есть это первый PHP-файл, в который попадает запрос, и (по сути) последний PHP-файл, через который проходит ответ приложения.

Давайте воспользуемся классическим примером с Hello, world!, обслуживаемым встроенным в PHP веб-сервером, чтобы проверить, всё ли настроено корректно. Если вы этого ещё не сделали, то удостоверьтесь, что в среде установлен PHP 7.1 или выше.

Создадим директорию проекта, в ней сделаем вложенную директорию , а внутри неё — файл с таким кодом:

Обратите внимание, здесь мы объявляем строгую типизацию — это нужно делать вашего приложения, — потому что подсказки типов (type hinting) важны для отладки и ясного понимания теми, кто будет заниматься кодом после вас. Далее с помощью инструмента командной строки (вроде Terminal на MacOS) перейдём в директорию проекта и запустим встроенный в PHP веб-сервер

Далее с помощью инструмента командной строки (вроде Terminal на MacOS) перейдём в директорию проекта и запустим встроенный в PHP веб-сервер.

Теперь откроем в браузере адрес http://localhost:8080/. Отображается Hello, world! без ошибок?

Отлично. Переходим к следующему шагу!

Зачем нужен .NET?

Немаловажное свойство нета в том, что программу или библиотеку, написанную на любом языке с поддержкой CLR можно использовать потом в любом другом языке с поддержкой CLR. (Например часто встречается C#+F# в одном проекте). Слово Framework в названии обозначает, что .NET абстрагирует программиста от компьютерного железа

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

Связанные разделыRelated Sections

Начало работыGetting StartedЗдесь содержится комплексный обзор платформы .NET Framework и ссылки на дополнительные ресурсы.Provides a comprehensive overview of the .NET Framework and links to additional resources.

Новые возможностиWhat’s NewЗдесь приводится описание ключевых новых возможностей и изменений в последней версии .NET Framework.Describes key new features and changes in the latest version of the .NET Framework. Сюда включены списки новых и устаревших типов и членов; также здесь приводится руководство по переносу приложений из предыдущей версии .NET Framework.Includes lists of new and obsolete types and members, and provides a guide for migrating your apps from the previous version of the .NET Framework.

ИнструментыToolsИнструменты, описанные в этом разделе, помогут в разработке, настройке и развертывании приложений с помощью технологий .NET Framework.Describes the tools that help you develop, configure, and deploy apps by using .NET Framework technologies.

Как работает PHP?

Прежде всего важно понять, как PHP-приложения взаимодействуют с внешним миром. PHP исполняет серверные приложения в цикле запрос/ответ

Всё взаимодействие с приложением — из браузера, командной строки или REST API — приходит в него в качестве запросов. При получении запроса приложение загружается, обрабатывает запрос и генерирует ответ, который передаётся обратно клиенту, а приложение закрывается. И так происходит при каждом обращении

PHP исполняет серверные приложения в цикле запрос/ответ. Всё взаимодействие с приложением — из браузера, командной строки или REST API — приходит в него в качестве запросов. При получении запроса приложение загружается, обрабатывает запрос и генерирует ответ, который передаётся обратно клиенту, а приложение закрывается. И так происходит при каждом обращении.

Клей, который всё скрепляет вместе

Проницательный читатель заметит, что DI-контейнер, несмотря на все трудности его конфигурирования и сборки, на самом деле ничего не делает. Диспетчер и промежуточное ПО могут работать и без контейнера.

Так зачем он нужен?

А что, если — как это почти всегда бывает в реальных приложениях — у класса есть зависимость?

Давайте её добавим и посмотрим, что произойдёт.

Перезагрузим браузер, и…

Ой.

Видим .

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

Давайте определим зависимость в контейнере и передадим его в для .

Вуаля! При перезагрузке браузера вы должны увидеть Hello, bar world!.

Завершение

С помощью 44 строк кода и нескольких широко используемых, тщательно протестированных, надёжных, взаимодействующих друг с другом компонентов мы реализовали программу современного PHP-приложения. Он совместим со стандартами PSR-4, PSR-7, PSR-11 и PSR-15, поэтому вам доступен широкий спектр реализаций HTTP-сообщений, DI-контейнеров, middleware и диспетчеров.

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

Использованное в статье приложение лежит в репозитории, можете свободно форкать и скачивать.


Если хотите почитать о качественных несвязанных пакетах, то очень рекомендую ознакомиться с Aura, The League of Extraordinary Packages, компонентами Symfony, компонентами Zend Framework, заточенными под безопасность библиотеками Paragon Initiative и списком совместимого с PSR-15 middlleware.

Если воспользуетесь этим кодом в , то, вероятно, вам понадобится вынести маршруты и определения контейнера в отдельные файлы, чтобы легче было сопровождать их по мере усложнения проекта. Также рекомендую реализовать EmitterStack для «умной» обработки скачиваний файлов и прочих больших ответов.

Next steps

  • If you’re new to the .NET Framework, see the overview for an introduction to key concepts and components.

  • For new features and improvements in the .NET Framework 4.5 and all later versions, see What’s New.

  • For detailed information about deploying the .NET Framework with your app, see Deployment Guide for Developers.

  • For changes that affect the deployment of the .NET Framework with your app, see Reducing System Restarts During .NET Framework 4.5 Installations.

  • For information about migrating your app from the .NET Framework 4 to .NET Framework 4.5 or later versions, see the migration guide.

  • See .NET Framework Reference Source to browse through .NET Framework source code online. The reference source is also available on GitHub. You can download the reference source for offline viewing and step through the sources (including patches and updates) during debugging. For more information, see the blog entry A new look for .NET Reference Source.

Правильная отправка ответов

Помните, я упомянул о выражении в ?

Это простой способ удостовериться, что мы получили простой ответ, но всё же это не лучший способ отправки выходных данных в браузер. Такой грубый подход заставляет делать лишнюю работу по отдаче отчетов — а этим должен заниматься другой класс, — что слишком усложняет отправку заголовков и кодов статуса, а также приводит к закрытию приложения, не давая шансов запуститься промежуточному ПО, идущему после .

Помните, что каждый промежуточный слой имеет возможность модифицировать запрос по пути в приложение, а также (в обратном порядке) модифицировать ответ по пути из приложения. В дополнение к стандартному интерфейсу для определяет структуру ещё одного HTTP-сообщения, которое будет нам полезно на обратной ветке цикла: . Если хотите, можете почитать подробнее о HTTP-сообщениях и о том, чем хороши стандарты PSR-7 Request и Response.

Обновим для возвращения .

Обновим определение контейнера, чтоб предоставлялся со свежим объектом .

Если мы сейчас обновим страницу, то получим пустой экран. Приложение возвращает из диспетчера промежуточных слоев правильный объект , а потом… что?

Просто ничего с ним не делает.

Нам нужен ещё один инструмент: эмиттер. Он находится между приложением и веб-сервером (Apache, nginx и т. д.) и отправляет ваш ответ клиенту, сгенерировавшему запрос. Эмиттер просто берёт объект Response и преобразует в инструкции, доступные для понимания серверным API.

Хорошие новости! Пакет , который мы уже используем для управления запросами, включает в себя эмиттер для ответов PSR-7.

Для простоты примера мы используем здесь очень простой эмиттер. Хотя он может быть гораздо сложнее, но в случае больших загрузок реальное приложение должно быть сконфигурировано для автоматического использования потокового эмиттера. Это хорошо описано в блоге Zend.

Обновим для получения от диспетчера и передачи в эмиттер.

Перезагрузим страницу — мы снова в деле! Пришло время для более надёжной обработки ответов.

В строке 15 заканчивается цикл запрос/ответ и вступает в работу веб-сервер.

Предназначение .NET Framework

Применяется для разработки приложений, работающих на локальной машине и веб-приложений. На нем могут быть также основаны веб-сервисы. Поддерживает языки программирования, в числе которых: Visual Basic и C#. Предоставляет разработчику выбор языка программирования, который будет использован при создании программы.

Удобство пользователей и разработчиков

С .NET Framework необходимость писать каждую программу «с нуля» отсутствует. Есть готовые фрагменты программного кода. Элементы окон стандартные. Разработчик лишь вставляет текст, формирует меню приложения и определяет, что будет происходит, когда вы нажмете на определенную кнопку.

Не приходится задумываться над особенностями кода, который нужен для поддержки программы операционной системой и для работы с сервисами Майкрософт, к которым относится и магазин приложений Windows Store. Платформа заботится об экономном использовании аппаратных ресурсов компьютера. Поэтому распространенные в начале века ситуации, когда пустяковый на первый взгляд софт загружал оперативную память, стали большой редкостью.

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

Универсальная платформа

Microsoft обеспечивает работу основанного на .NET Framework софта во всех поддерживаемых компанией операционных системах.


Степень обратной совместимости ПО высока. Рассмотрю на примере старых версий. Вам нужна программа, основанная на версии 2.0. Запускаете ее на ноутбуке или настольном ПК с поздней версией. И старый софт будет работать.

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

Для разработчиков предусмотрены инструменты упаковки приложений. Они легко устанавливаются на ПК.

Архитектура .NET Framework

CLI («Common Language Infrastructure») — платформа, на которой выполняются программы. Основные функции CLI:

  • Обработка исключений. К ним относятся ошибки, возникающие при работе программы. Приведу примеры:
    • Приложение пытается открыть на локальном компьютере файл, который отсутствует
    • Приложение обращается к базе данных, а соединение с ней отсутствует
  • Чистка мусора, то есть удаление ресурсов, которые больше не нужны. Проверяется, какие ресурсы не используются и производится их освобождение для выполнения других задач. Примеры фрагментов, которые удаляются в процессе работы без вмешательства пользователя:
    • Дескриптор файла, который больше не требуется
    • В соединении с базой данных больше нет необходимости. Программа завершила все операции с базой данных
  • Работа с различными языками программирования

Уровни .NET Framework

Выделяются три уровня:

  1. Языки программирования. Часто используемые: VB.NET и C#
  2. Компиляторы. Для каждого языка программирования предусмотрен отдельный компилятор. Для VB.NET — один, для C# — другой
  3. Интерпретатор «Common Language Interpreter» используется для запуска приложения, написанного на любом языке программирования. Поэтому компилятор отравит программу в него для последующего запуска приложения

Библиотеки

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

Типы основанных на платформе приложений

ПО, которое может работать на основе .NET Framework:

  • WinForms: программы, которые будут работать на компьютере пользователя. Пример клиентского приложения: текстовый редактор «Блокнот»
  • ASP.NET применяется для разработки веб-приложений, которые станут работать в любом браузере, в том числе: Chrome, Edge, Firefox. При этом:
    • Веб-приложение будет обрабатываться на сервере, на котором установлены информационные службы интернета (IIS)
    • IIS — это компонент Microsoft, который применяется для запуска приложения ASP.NET
    • Результат выполнения отправляется на компьютер пользователя и отображается в браузере
  • Технология ADO.NET применяется для создания приложений, предназначенных для работы с базами данных, такими как Microsoft SQL Server и Oracle

Контейнер внедрения зависимостей

Поскольку мы настроили Composer, установка PHP-DI пройдёт практически безболезненно. Для этого снова обратимся к командной строке:

Обновите для конфигурирования и сборки контейнера.

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

Мы , поэтому нужно явно объявить зависимости (а не использовать автоматическое внедрение или аннотации) и извлечь из контейнера объект .

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

Давайте ещё больше всё упростим, импортировав пространства имён там, где это возможно.

Пока что выглядит всё так, словно мы устроили суматоху ради выполнения того, что уже делали раньше.

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

Автозагрузка и сторонние пакеты

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

Выход — автозагрузка. Это означает, что, когда вашему приложению нужно использовать какой-то класс, PHP знает, где его найти, и автоматически загружает в момент вызова. Эта возможность существует со времён PHP 5, но стала активно применяться только с появлением PSR-0 (стандарта автозагрузки, сегодня заменён PSR-4).

Можно было бы пройти через тягомотину написания собственного автозагрузчика, но раз мы выбрали Composer для управления сторонними зависимостями, а в нём уже есть очень удобный автозагрузчик, то его мы и будем использовать.

Проверьте, что у вас установлен Composer. Затем настройте его для своего проекта.

После этого пройдите через интерактивное руководство по генерированию конфигурационного файла . Затем откройте его в редакторе и добавьте поле , чтобы получилось так, как показано ниже (тогда автозагрузчик будет знать, где искать ваши классы).

Теперь установите для этого проекта Composer, которые подтянет все зависимости (если они уже есть) и настроит для нас автозагрузчик.

Обновите для запуска автозагрузчика. В идеале это одно из нескольких выражений include, которые вы используете в приложении.

Если перезагрузить приложение в браузере, вы не увидите никакой разницы. Однако автозагрузчик работает, просто он не делает ничего тяжёлого. Давайте перенесём пример с Hello, world! в автоматически загружаемый класс, чтобы проверить, как всё работает.

В корне проекта создадим папку и вставим в неё файл с таким кодом:

Теперь в замените выражение echo вызовом метода announce в классе .

Перезагрузите приложение в браузере и увидите новое сообщение!

Как используют .NET?

.NET широко используется в вебе на бэкенде (Asp.NET), набирает популяроность на фронте (Blazor), популярен в игровой индустрии, по крайней мере в сфере инди (Unity), его применяют в машинном обучении (ML.NET) и Data Science вообще. Абсолютное большинство приложений на Windows (как и значительная часть самой Windows (высокоуровневые её компоненты) написаны на .NET) для приложений: (Windows Forms, WPF, UWP, медленно набирает популярность кросплатформенная библиотека Avalonia), на .NET разрабатывают мобильные приложения (и Android и iOS) (Xamarin), и используют во встраиваемых системах. Короче, на нём можно делать почти всё, если захотеть.

Важная деталь заключается в зоопарке реализаций и обобщающих технологий: .NET Framework, .NET Core, .NET Standard, Mono, а такие ребята как AOT компилятор в Xamarin для iOS и il2cpp в Unity. И многие перечисленные сверху пункты как раз отличаются используемым рантаймом. На эту тему есть плохая статья на хабре с неплохими комментариями. Короче, тема сложная, но это отступление нужно чтобы ответить на вопрос…


С этим читают