Введение в .NET

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

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

При использовании .NET файлы кода и проекта будут выглядеть одинаково, независимо от типа создаваемого приложения. У вас есть доступ к одинаковым возможностям среды выполнения, API и языка для каждого приложения.

Кроссплатформенные

Вы можете создавать приложения .NET для многих операционных систем, в том числе:

  • Windows
  • macOS
  • Linux
  • Android
  • iOS
  • tvOS
  • watchOS

Поддерживаемые архитектуры процессоров:

  • X64
  • x86
  • ARM32
  • ARM64

.NET позволяет использовать специальные возможности платформы, такие как API операционной системы. Примерами являются Windows Forms и WPF в Windows и собственные привязки к каждой мобильной платформе из Xamarin.

Дополнительные сведения см. в разделах Поддерживаемая политика жизненного цикла ОС и Каталог .NET RID.

Открытый исходный код

Платформа .NET имеет открытый код и распространяется по лицензиям MIT и Apache 2. .NET — это проект .NET Foundation.

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

Поддержка

Корпорация Майкрософт реализует поддержку платформы .NET для операционных систем Windows, macOS и Linux. Она регулярно обновляется для обеспечения безопасности и качества (второй вторник каждого месяца).

Двоичные дистрибутивы .NET от Майкрософт собираются и тестируются в Azure на серверах Майкрософт и следуют методикам проектирования и безопасности Майкрософт.

Red Hat поддерживает .NET в операционной системе Red Hat Enterprise Linux (RHEL). Red Hat и Майкрософт совместно занимаются обеспечением беспроблемной работы .NET Core в RHEL.

Tizen поддерживает .NET на платформах Tizen.

Дополнительные сведения см. в статье Выпуски и поддержка .NET и .NET 5.

Инструменты и производительность

.NET предоставляет возможность выбора языков, интегрированных сред разработки (IDE) и других средств.

Языки программирования

Архитектура .NET поддерживает три языка программирования.

  • C#

    C# (произносится как "си шарп") — современный объектно-ориентированный и типобезопасный язык программирования. C# относится к широко известному семейству языков C, и покажется хорошо знакомым любому, кто работал с C, C++, Java или JavaScript.

  • F#

    Язык F# поддерживает функциональные, объектно-ориентированные и императивные модели программирования.

  • Visual Basic

    Среди языков .NET синтаксис Visual Basic лучше всего соответствует обычному естественному языку, что значительно упрощает его изучение. В отличие от C# и F#, для которых корпорация Майкрософт активно разрабатывает новые функции, язык Visual Basic является стабильным. Visual Basic не поддерживается для веб-приложений, но поддерживается для веб-API.

Ниже приведены некоторые возможности, поддерживаемые языками .NET:

Интегрированные среды разработки

Интегрированные среды разработки для .NET включают следующие:

  • Visual Studio

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

  • Visual Studio Code

    Выполняется в Windows, macOS и Linux. Бесплатно и с открытым кодом. Расширения доступны для работы с языками .NET.

  • Visual Studio для Mac

    Выполняется только в macOS. Для разработки приложений и игр .NET для iOS, Android и Интернета.

  • GitHub Codespaces

    Онлайн-среда Visual Studio Code, которая в настоящее время доступна в виде бета-версии.

Пакет SDK и среды выполнения

Пакет SDK для .NET — это набор библиотек и средств для разработки и запуска приложений .NET.

При загрузке .NET можно выбрать пакет SDK или среду выполнения, например среду выполнения .NET или среду выполнения ASP.NET Core. Установите среду выполнения на компьютере, который требуется подготовить для запуска приложений .NET. Установите пакет SDK на компьютере, который вы хотите использовать для разработки. При скачивании пакета SDK вы автоматически получаете среду выполнения.

Загружаемый пакет SDK содержит следующие компоненты.

  • Интерфейс командной строки .NET. Программы командной строки, которые можно использовать для локальной разработки и сценариев непрерывной интеграции.
  • Драйвер dotnet. Команда CLI, которая запускает зависящие от платформы приложения.
  • Компиляторы языков программирования Roslyn и F#.
  • Система сборки MSBuild.
  • Среда выполнения .NET. Предоставляет систему типов, функцию загрузки сборок, сборщик мусора, взаимодействие с машинным кодом и другие основные службы.
  • Библиотеки среды выполнения. Предоставляют примитивные типы данных и основные служебные программы.
  • Среда выполнения ASP.NET Core Предоставляет базовые службы для приложений, подключенных к Интернету, таких как веб-приложения, приложения Интернета вещей и серверные интерфейсы мобильных устройств.
  • Среда выполнения для классических приложений. Предоставляет базовые службы для классических приложений Windows, включая Windows Forms и WPF.

Загружаемая среда выполнения содержит следующие компоненты.

  • Среды выполнения для рабочего стола и ASP.NET Core (при необходимости).
  • Среда выполнения .NET. Предоставляет систему типов, функцию загрузки сборок, сборщик мусора, взаимодействие с машинным кодом и другие основные службы.
  • Библиотеки среды выполнения. Предоставляют примитивные типы данных и основные служебные программы.
  • Драйвер dotnet. Команда CLI, которая запускает зависящие от платформы приложения.

Дополнительные сведения см. в следующих ресурсах:

Система проектов и MSBuild

Приложение .NET строится на основе исходного кода с помощью MSBuild. В файле проекта ( .csproj, .fsproj или .vbproj) указываются целевые объекты и связанные задачи, которые отвечают за компиляцию, упаковку и публикацию кода. Существуют идентификаторы пакета SDK, которые ссылаются на стандартные коллекции целевых объектов и задач. Использование этих идентификаторов помогает сделать файлы проекта небольшими и простыми в работе. Например, вот файл проекта для консольного приложения:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
</Project>

И вот один для веб-приложения:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
</Project>

В этих примерах атрибут Sdk элемента Project указывает набор целевых объектов и задач MSBuild, которые создают проект. Элемент TargetFramework указывает версию .NET, от которой зависит приложение. Файл проекта можно изменить, добавив дополнительные целевые объекты и задачи, относящиеся к проекту.

Дополнительные сведения см. в статьях Обзор пакета SDK для проекта .NET и Целевые платформы.

CI/CD

MSBuild и .NET CLI можно использовать с различными средствами и средами непрерывной интеграции, например:

Дополнительные сведения см. в разделе Использование пакета SDK и средств .NET при непрерывной интеграции (CI)

NuGet

NuGet — это диспетчер пакетов с открытым исходным кодом, разработанный для .NET. Пакет NuGet представляет собой отдельный ZIP-файл с расширением .nupkg, который содержит скомпилированный код (DLL), другие файлы, связанные с этим кодом, и описательный манифест, включающий такие сведения, как номер версии пакета. Разработчики, у которых есть код, к которому нужно предоставить общий доступ, создают пакеты и публикуют их на сайте nuget.org или на закрытых узлах. Разработчики, желающие использовать общий код, добавляют пакет в свой проект и затем могут вызвать API, предоставляемый пакетом в своем коде проекта.

Дополнительные сведения см. в документации NuGet.

Интерактивные возможности .NET

.NET Interactive — это группа средств и интерфейсов командной строки, которые позволяют пользователям создавать интерактивные возможности в веб-приложениях, разметке и записных книжках.

Дополнительные сведения см. в следующих ресурсах:

Модели выполнения.

Приложения .NET запускают управляемый код в среде выполнения, известной как среда CLR.

CLR

.NET CLR — это кроссплатформенная среда выполнения, которая включает поддержку Windows, macOS и Linux. Среда CLR обрабатывает выделение памяти и управление ей. Среда CLR также является виртуальной машиной, которая не только выполняет приложения, но и создает, а также компилирует код с помощью JIT-компилятора.

Для получения дополнительной информации см. Common Language Runtime.

JIT-компилятор и промежуточный язык

Языки .NET более высокого уровня, например C#, компилируются до независимого от оборудования набора инструкций, который называется промежуточным языком (IL). При запуске приложений этот компилятор преобразует IL в машинный код, который понимает обработчик. JIT-компиляция происходит на том же компьютере, на котором будет выполняться код.

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

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

Дополнительные сведения см. в статьях Управляемый процесс выполнения и Многоуровневая компиляция.

Компилятор AOT

По умолчанию большинство рабочих нагрузок .NET являются JIT-компилятором, но .NET предлагает две формы компиляции на момент времени (AOT):

  • Для некоторых сценариев требуется 100-процентная компиляция AOT. Примером может служить iOS.
  • В других сценариях большая часть кода приложения компилируется с помощью AOT, но для некоторых частей используется JIT-компилятор. Некоторые шаблоны кода не распознаются AOT (например, универсальные шаблоны). Примером такой формы компиляции AOT является параметр публикации ready-to-run. Такая форма AOT позволяет использовать преимущества компиляции без ее недостатков.

Автоматическое управление памятью

Сборщик мусора (GC) управляет выделением и освобождением памяти для приложений. Каждый раз, когда код создает новый объект, среда CLR выделяет память для объекта из управляемой кучи. Пока в управляемой куче есть доступное адресное пространство, среда выполнения продолжает выделять пространство для новых объектов. Когда остается недостаточное свободное пространство адресов, сборщик мусора проверяет наличие объектов в управляемой куче, которые больше не используются приложением. Затем эта память освобождается.

GC — это одна из служб CLR, которая помогает обеспечить безопасность памяти. Программа является безопасной по памяти, если она обращается только к выделенной памяти. Например, среда выполнения гарантирует, что приложение не обращается к невыделенной памяти за пределами границ массива.

Дополнительные сведения о сборке мусора см. в статьях Автоматическое управление памятью и Основы сборки мусора.

Работа с неуправляемыми ресурсами

Иногда код должен ссылаться на неуправляемые ресурсы. Неуправляемые ресурсы — это ресурсы, которые не обслуживаются средой выполнения .NET автоматически. Например, к неуправляемым ресурсам относятся дескрипторы файлов. Объект FileStream — управляемый, но он ссылается на дескриптор файла, который является неуправляемым ресурсом. После окончания работы с FileStream нужно явным образом освободить дескриптор файла.

В среде .NET объекты, которые ссылаются на неуправляемые ресурсы, реализуют интерфейс IDisposable. После окончания работы с объектом вызовите метод Dispose() объекта, который отвечает за освобождение неуправляемых ресурсов. В языках .NET имеется удобная инструкция using (C#, F#, VB), которая обеспечивает вызов метода Dispose.

Дополнительные сведения см. в разделе Очистка неуправляемых ресурсов.

Модели развертывания

Приложения .NET можно публиковать в двух разных режимах:

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

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

    Можно установить несколько версий среды выполнения параллельно, чтобы запускать зависящие от платформы приложения, предназначенные для разных версий среды выполнения. Дополнительные сведения см. в разделе Целевые платформы.

Исполняемые файлы создаются для конкретных целевых платформ, которые указываются с помощью идентификатора среды выполнения (RID).

Дополнительные сведения см. в статьях Общие сведения о публикации приложений .NET и Введение в .NET и Docker.

Библиотеки среды выполнения.

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

Ниже приведены некоторые примеры типов, определенных в библиотеках среды выполнения .NET:

Подробнее см. в статье Общие сведения о библиотеках среды выполнения. Исходный код для библиотек находится в репозитории GitHub dotnet/runtime.

Расширения библиотек среды выполнения

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

Пакет NuGet Документация
Microsoft.Extensions.Hosting Управление жизненным циклом приложения (универсальный узел)
Microsoft.Extensions.DependencyInjection Внедрение зависимостей
Microsoft.Extensions.Configuration Конфигурация
Microsoft.Extensions.Logging Logging
Microsoft.Extensions.Options Шаблон параметров

Дополнительные сведения см. в репозитории dotnet/extensions на сайте GitHub.

Доступ к данным

.NET предоставляет объектно-реляционный модуль сопоставления (ORM) и способ написания SQL-запросов в коде.

Entity Framework Core

Entity Framework (EF) Core — это кроссплатформенная технология доступа к данным на разных платформах с открытым исходным кодом, которая может служить в качестве ORM. EF Core позволяет работать с базой данных, ссылаясь на объекты .NET в коде. Это сокращает объем кода доступа к данным, который в противном случае потребуется для написания и тестирования. EF Core поддерживает множество систем баз данных.

Дополнительные сведения см. в разделах Entity Framework Core и Поставщики баз данных.

LINQ

LINQ позволяет писать декларативный код для работы с данными. Данные могут быть представлены разными формами (например, объектами в памяти, содержимым базы данных SQL или XML-документом), но обычно создаваемый код LINQ не отличается для каждого из источников данных.

Дополнительные сведения см. в разделе Обзор встроенного языка запросов (LINQ).

Терминология .NET

Для понимания документации по .NET важно понять, как использование некоторых терминов изменилось со временем.

.NET Core и .NET 5

В 2002 году корпорация Майкрософт выпустила .NET Framework, платформу разработки для создания приложений Windows. Сегодня доступна версия 4.8 платформы .NET Framework, и она по-прежнему поддерживается Майкрософт.

В 2014 году корпорация Майкрософт начала создавать кроссплатформенный преемник платформы .NET Framework с открытым исходным кодом. Эта новая реализация .NET называлась .NET Core, пока не была выпущена версия 3.1. Следующая версия после .NET Core 3.1 — .NET 5.0. Номер версии 4 был пропущен во избежание путаницы между этой реализацией .NET и .NET Framework 4.8. Слово "Core" было удалено из названия, чтобы указать, что теперь это основная реализация .NET.

Эта статья посвящена .NET 5, но большая часть документации по .NET 5 по-прежнему ссылается на .NET Core или .NET Framework. Кроме того, слово "Core" остается в именах ASP.NET Core и Entity Framework Core.

Документация также относится к .NET Standard. .NET Standard — это спецификация API, которая позволяет разрабатывать библиотеки классов для нескольких реализаций .NET.

Дополнительные сведения см. в разделе Архитектурные компоненты .NET.

Уточнение терминологии

Часть терминологии .NET может показаться запутанной, поскольку одно и то же слово используется по-разному в разных контекстах. Ниже приведены некоторые из более заметных примеров:

  • Среда выполнения

    Контекст Значение термина "среда выполнения"
    Среда CLR Среда выполнения для управляемой программы. Операционная система является частью среды выполнения, но не входит в среду выполнения .NET.
    Среда выполнения .NET на странице загрузки .NET CLR и библиотеки среды выполнения, которые обеспечивают поддержку запуска приложений, зависящих от платформы. На странице также предлагаются варианты среды выполнения для серверных приложений ASP.NET Core и классических приложений Windows.
    Идентификатор среды выполнения (RID) Платформа ОС и архитектура ЦП, на которых работает приложение .NET. Пример: 64-разрядная версия Windows, 64-разрядная версия Linux.
  • платформа

    Контекст Значение термина "платформа"
    .NET Framework Исходная реализация .NET только для Windows. Слово "Framework" указывается с первой прописной буквы.
    целевая платформа Коллекция API-интерфейсов, которую использует приложение или библиотека .NET. Примеры: .NET Core 3.1, .NET Standard 2.0
    Моникер целевой платформы (TFM) TFM — это стандартизированный формат маркера для указания целевой платформы приложения или библиотеки .NET. Пример: net462 для .NET Framework 4.6.2.
    Приложение, зависящее от платформы Приложение, которое может выполняться на компьютере, где установлена среда выполнения со страницы загрузки .NET. "Платформа" в этом контексте — то же самое, что и среда выполнения, загружаемая со страницы загрузки .NET.
    Библиотеки платформы Иногда используется в качестве синонима для библиотек среды выполнения.
  • Пакет SDK

    Контекст Значение термина "пакет SDK"
    Пакет SDK на странице загрузки .NET Набор средств и библиотек, которые вы скачиваете и устанавливаете для разработки и запуска приложений .NET. Включает в себя интерфейс командной строки, MSBuild, среду выполнения .NET и другие компоненты.
    Проекты в стиле SDK Набор целевых объектов и задач MSBuild, указывающий, как следует создавать проект для конкретного типа приложения. Пакет SDK в этом смысле указывается с помощью атрибута Sdk элемента Project в файле проекта.
  • platform

    Контекст Значение термина "платформа"
    Кроссплатформенность Здесь термин "платформа" означает операционную систему и оборудование, на котором она выполняется, например Windows, macOS, Linux, iOS и Android.
    Платформа .NET Возможны разные варианты использования. Может иметься ввиду одна реализация .NET (например, .NET Framework или .NET 5) или абстрактная концепция .NET, включая все реализации.

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

Сложные сценарии

В следующих разделах описываются некоторые возможности .NET, которые полезны в расширенных сценариях.

Взаимодействие на уровне машинного кода

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

Основным способом осуществления взаимодействия с собственными API является "вызов неуправляемого кода" или сокращенно P/Invoke. P/Invoke поддерживается на платформах Linux и Windows. Способ, который подходит только для Windows, называется "COM-взаимодействием" и используется для работы с COM-компонентами в управляемом коде. Он основан на инфраструктуре P/Invoke, но работает иначе.

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

Небезопасный код

В зависимости от языковой поддержки среды CLR позволяет обращаться к внутренней памяти выполнять арифметические операции с указателями в коде unsafe. Эти операции необходимы для реализации определенных алгоритмов и системного взаимодействия. Хотя небезопасный код и предоставляет обширные возможности, использовать его не рекомендуется, если только это не требуется для взаимодействия с системными API или реализации максимально эффективного алгоритма. Небезопасный код может выполняться по-разному в разных средах, а также терять преимущества сборщика мусора и безопасности типов. Рекомендуется четко отделить и централизовать небезопасный код, а также тщательно протестировать его.

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

Дальнейшие действия