Overview of .net framework

Что такое фреймворк

Если обратиться к истории самого слова «фреймворк», то этот неологизм появился в языке относительно недавно, примерно в начале XXI века. С английского слово “framework” можно перевести как «конструкция», «структура», «каркас», «корпус» или «остов». Понимание перевода слова ведет к понимаю сути фреймворка: это специальная программная среда выполнения, программный каркас, который облегчает разработку программ и объединение компонентов, так как уже содержит в себе некую основу, не меняющуюся от конфигурации к конфигурации часть, которую следует лишь наполнить сменными моделями или точками расширения.
В отличие от динамической библиотеки (DLL), которая предоставляет собой лишь набор ограниченных функций, фреймворк является каркасом, согласно которому будет строиться архитектура приложения, то есть он определяет взаимосвязь между компонентами. Более того, фреймворк может содержать много разных по тематике библиотек.

При этом фреймворки можно поделить на следующие виды:

  • фреймворк программной системы;
  • фреймворк приложения;
  • фреймворк концептуальной модели.

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

.NET, .NET Framework, and .NET Core

.NET is a developer platform made up of tools, programming languages, and libraries for building many different types of applications.

There are various implementations of .NET. Each implementation allows .NET code to execute in different places—Linux, macOS, Windows, iOS, Android, and many more.

  1. .NET Framework is the original implementation of .NET. It supports running websites, services, desktop apps, and more on Windows.
  2. .NET Core is a cross-platform implementation for running websites, services, and console apps on Windows, Linux, and macOS. .NET Core is open source on GitHub.
  3. Xamarin/Mono is a .NET implementation for running apps on all the major mobile operating systems, including iOS and Android.

When to choose .NET Framework

.NET Core/5+ offers significant benefits for new applications and application patterns. However, .NET Framework continues to be the natural choice for many existing scenarios, and as such, .NET Framework isn’t replaced by .NET Core/5+ for all server applications.

Current .NET Framework applications

In most cases, you don’t need to migrate your existing applications to .NET Core/5+. Instead, a recommended approach is to use .NET Core/5+ as you extend an existing application, such as writing a new web service in ASP.NET Core.

Third-party libraries or NuGet packages not available for .NET Core/5+

.NET Standard enables sharing code across all .NET implementations, including .NET Core/5+. With .NET Standard 2.0, a compatibility mode allows .NET Standard and .NET Core/5+ projects to reference .NET Framework libraries. For more information, see .

You need to use .NET Framework only in cases where the libraries or NuGet packages use technologies that aren’t available in .NET Standard or .NET Core/5+.

.NET Framework technologies not available for .NET Core/5+

Some .NET Framework technologies aren’t available in .NET Core/5+. The following list shows the most common technologies not found in .NET Core/5+:

  • ASP.NET Web Forms applications: ASP.NET Web Forms are only available in .NET Framework. ASP.NET Core cannot be used for ASP.NET Web Forms.

  • ASP.NET Web Pages applications: ASP.NET Web Pages aren’t included in ASP.NET Core.

  • WCF services implementation. Even when there’s a WCF client library to consume WCF services from .NET Core/5+, WCF server implementation is currently only available in .NET Framework.

  • Workflow-related services: Windows Workflow Foundation (WF), Workflow Services (WCF + WF in a single service), and WCF Data Services (formerly known as «ADO.NET Data Services») are only available in .NET Framework.

  • Language support: Visual Basic and F# are currently supported in .NET Core/5+, but not for all project types. For a list of supported project templates, see .

For more information, see .NET Framework technologies unavailable in .NET 5.

Platform doesn’t support .NET Core/5+

Some Microsoft or third-party platforms don’t support .NET Core/5+. Some Azure services provide an SDK not yet available for consumption on .NET Core/5+. In such cases, you can use the equivalent REST API instead of the client SDK.

Python-фреймворки

Django – это один из самых известных фреймворков в целом и, безусловно, самый популярный фреймворк на языке Python. Удивительно, но для того, чтобы начать использовать Django, вам даже не нужны глубокое знание языка Python. Отличительной особенностью Django является его принцип DRY, который расшифровывается как “Don’t repeat yourself”. Мысль, выраженная в этой фразе, ведет к тому, что разработчикам не следует повторять те строки кода, которые они уже использовали, и благодаря этому исходный код выглядит более лаконично и понятно. К преимуществам фреймворка можно также отнести стандартную структуру (благодаря которой даже сторонний программист сможет разобраться в коде) и наследование шаблонов. Многие знакомы с Django в качестве системы администрирования, однако эта CMS подойдет только опытным пользователям, знакомым с программированием.

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

TurboGears – известный Python-фреймворк с более чем 10-летней историей. Он предназначен для разработки веб-проектов и состоит из различных WSGI-компонентов, в том числе Pylons и CherryPy. Благодаря этому можно говорить о TurboGears как о мощном фреймворке с богатым функционалом. Он поддерживает множество баз данных и форматов обмена данными, также поддерживает различные JavaScript-библиотеки и горизонтальное масштабирование данных.

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

Web2spy – этот фреймворк, как и некоторые другие, основывается на концепции RAD (rapid application development)

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

Это полнофункциональный фреймворк, который содержит компоненты для всех основных функций.

Во второй части будут рассмотрены фреймворки следующих языков программирования: Ruby, Java, JavaScript.

Скачивание и установка вручнуюDownload and manually install

В качестве альтернативы установщикам Windows для .NET можно скачать и вручную установить пакет SDK или среду выполнения.As an alternative to the Windows installers for .NET, you can download and manually install the SDK or runtime. Установка вручную как правило выполняется в рамках тестирования непрерывной интеграции.Manual install is usually done as part of continuous integration testing. В большинстве случаев разработчикам и пользователям рекомендуется использовать установщик.For a developer or user, it’s generally better to use an installer.

Как пакет SDK для .NET, так и среду выполнения .NET можно установить вручную после скачивания.Both .NET SDK and .NET Runtime can be manually installed after they’ve been downloaded. При установке пакета SDK для .NET не нужно устанавливать соответствующую среду выполнения.If you install .NET SDK, you don’t need to install the corresponding runtime. Сначала скачайте двоичный выпуск пакета SDK или среды выполнения с одного из следующих сайтов:First, download a binary release for either the SDK or the runtime from one of the following sites:

  • Скачиваемые файлы для .NET 5.0.NET 5.0 downloads
  • Скачиваемые файлы для .NET Core 3.1.NET Core 3.1 downloads
  • Скачиваемые файлы для .NET Core 2.1.NET Core 2.1 downloads
  • Все скачиваемые файлы для .NET CoreAll .NET Core downloads

Создайте каталог, в который будет выполнено извлечение .NET, например .Create a directory to extract .NET to, for example . Затем извлеките скачанный ZIP-файл в этот каталог.Then, extract the downloaded zip file into that directory.

По умолчанию команды и приложения .NET CLI не будут использовать платформу .NET, установленную таким образом. Вам нужно выбрать ее явно.By default, .NET CLI commands and apps won’t use .NET installed in this way and you must explicitly choose to use it. Для этого измените переменные среды, с которыми запускается приложение:To do so, change the environment variables with which an application is started:

Такой подход позволяет установить несколько версий в отдельные расположения, а затем явно выбрать расположение установки, которое должно использовать приложение, запустив приложение с переменными среды, указывающими на это расположение.This approach lets you install multiple versions into separate locations, then explicitly choose which install location an application should use by running the application with environment variables pointing at that location.

Если параметр имеет значение , .NET игнорирует любые установленные глобально версии .NET.When is set to , .NET ignores any globally installed .NET version. Если нужно, чтобы платформа .NET учитывала глобальное расположение установки по умолчанию при выборе лучшей платформы для запуска приложения, удалите этот параметр среды.Remove that environment setting to let .NET consider the default global install location when selecting the best framework for running the application. По умолчанию обычно используется каталог , в который выполняется установка .NET при использовании установщика.The default is typically , which is where the installers install .NET.

Случаи использования .NET FrameworkWhen to choose .NET Framework

Среда .NET 5 предоставляет значительные преимущества для новых приложений и шаблонов приложений..NET 5 offers significant benefits for new applications and application patterns. Но платформа .NET Framework остается оптимальным выбором во многих ситуациях, поэтому .NET 5 не заменит .NET Framework для всех серверных приложений.However, .NET Framework continues to be the natural choice for many existing scenarios, and as such, .NET Framework isn’t replaced by .NET 5 for all server applications.

Готовые приложения .NET FrameworkCurrent .NET Framework applications

В большинстве случаев вам не потребуется переносить готовые приложения в среду .NET 5.In most cases, you don’t need to migrate your existing applications to .NET 5. Взамен мы советуем использовать .NET 5 для расширения готовых приложений, например для написания новой веб-службы в ASP.NET Core.Instead, a recommended approach is to use .NET 5 as you extend an existing application, such as writing a new web service in ASP.NET Core.

.NET Standard позволяет совместно использовать код во всех реализациях .NET, включая .NET 5..NET Standard enables sharing code across all .NET implementations, including .NET 5. В .NET Standard 2.0 этот режим совместимости позволяет проектам .NET Standard и .NET 5 ссылаться на библиотеки .NET Framework.With .NET Standard 2.0, a compatibility mode allows .NET Standard and .NET 5 projects to reference .NET Framework libraries. Дополнительные сведения см. в статье .For more information, see .

Платформу .NET Framework следует применять только в случаях, где библиотеки или пакеты NuGet используют технологии, которые недоступны в .NET Standard и .NET 5.You need to use .NET Framework only in cases where the libraries or NuGet packages use technologies that aren’t available in .NET Standard or .NET 5.

Технологии .NET, недоступные для .NET 5.NET technologies not available for .NET 5

Некоторые технологии .NET Framework недоступны в среде .NET 5.Some .NET Framework technologies aren’t available in .NET 5. Ниже приведен список самых распространенных технологий, которые недоступны в .NET 5:The following list shows the most common technologies not found in .NET 5:

  • Приложения веб-форм ASP.NET. Веб-формы ASP.NET доступны только в среде .NET Framework.ASP.NET Web Forms applications: ASP.NET Web Forms are only available in .NET Framework. ASP.NET Core не может использоваться для веб-форм ASP.NET.ASP.NET Core cannot be used for ASP.NET Web Forms.

  • Приложения веб-страниц ASP.NET. Веб-страницы ASP.NET не добавлены в среду ASP.NET Core.ASP.NET Web Pages applications: ASP.NET Web Pages aren’t included in ASP.NET Core.

  • Реализация служб WCF.WCF services implementation. Хотя в среду .NET 5 и добавлена библиотека клиента WCF, позволяющая использовать службы WCF, сервер WCF можно реализовать только в среде .NET Framework.Even when there’s a WCF client library to consume WCF services from .NET 5, WCF server implementation is currently only available in .NET Framework.

  • Службы, связанные с рабочими процессами. Службы Windows Workflow Foundation (WF), Workflow Services (WCF и WF в одной службе) и WCF Data Services (известные как «Службы данных ADO.NET») доступны только в среде .NET Framework.Workflow-related services: Windows Workflow Foundation (WF), Workflow Services (WCF + WF in a single service), and WCF Data Services (formerly known as «ADO.NET Data Services») are only available in .NET Framework.

  • Поддержка языков. Сейчас в среде .NET 5 поддерживаются Visual Basic и F#, но не для всех типов проектов.Language support: Visual Basic and F# are currently supported in .NET 5, but not for all project types. Список поддерживаемых шаблонов проектов см. в статье о .For a list of supported project templates, see .

Дополнительные сведения см. в разделе Технологии .NET Framework, недоступные в .NET 5.For more information, see .NET Framework technologies unavailable in .NET 5.

Платформа не поддерживает .NET 5Platform doesn’t support .NET 5

Некоторые платформы Майкрософт и платформы сторонних поставщиков не поддерживают среду .NET 5.Some Microsoft or third-party platforms don’t support .NET 5. Некоторые службы Azure предоставляют пакеты SDK, недоступные в среде .NET 5.Some Azure services provide an SDK not yet available for consumption on .NET 5. В таких случаях в качестве альтернативы клиентскому пакету SDK можно использовать REST API.In such cases, you can use the equivalent REST API instead of the client SDK.

What is .NET Framework?

.NET Framework is a managed execution environment for Windows that provides a variety of services to its running apps. It consists of two major components: the common language runtime (CLR), which is the execution engine that handles running apps, and the .NET Framework Class Library, which provides a library of tested, reusable code that developers can call from their own apps. The services that .NET Framework provides to running apps include the following:

  • Memory management. In many programming languages, programmers are responsible for allocating and releasing memory and for handling object lifetimes. In .NET Framework apps, the CLR provides these services on behalf of the app.

  • A common type system. In traditional programming languages, basic types are defined by the compiler, which complicates cross-language interoperability. In .NET Framework, basic types are defined by the .NET Framework type system and are common to all languages that target .NET Framework.

  • An extensive class library. Instead of having to write vast amounts of code to handle common low-level programming operations, programmers use a readily accessible library of types and their members from the .NET Framework Class Library.

  • Development frameworks and technologies. .NET Framework includes libraries for specific areas of app development, such as ASP.NET for web apps, ADO.NET for data access, Windows Communication Foundation for service-oriented apps, and Windows Presentation Foundation for Windows desktop apps.

  • Language interoperability. Language compilers that target .NET Framework emit an intermediate code named Common Intermediate Language (CIL), which, in turn, is compiled at runtime by the common language runtime. With this feature, routines written in one language are accessible to other languages, and programmers focus on creating apps in their preferred languages.

  • Version compatibility. With rare exceptions, apps that are developed by using a particular version of .NET Framework run without modification on a later version.

  • Side-by-side execution. .NET Framework helps resolve version conflicts by allowing multiple versions of the common language runtime to exist on the same computer. This means that multiple versions of apps can coexist and that an app can run on the version of .NET Framework with which it was built. Side-by-side execution applies to the .NET Framework version groups 1.0/1.1, 2.0/3.0/3.5, and 4/4.5.x/4.6.x/4.7.x/4.8.

  • Multitargeting. By targeting .NET Standard, developers create class libraries that work on multiple .NET Framework platforms supported by that version of the standard. For example, libraries that target .NET Standard 2.0 can be used by apps that target .NET Framework 4.6.1, .NET Core 2.0, and UWP 10.0.16299.

Архитектура веб-фреймворков

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

Существует множество open-source сообществ и коммерческих организаций, которые создают приложения или расширения для популярных фреймворков, например, Django REST Framework, ng-bootstrap и т.д.

MVC — Модель, Представление и Контроллер (Model-View-Controller) — три составляющих каждого веб-фреймворка.

Модель MVC используется во всех веб-фреймворках

  • Модель содержит все данные и уровни бизнес-логики, её правила и функции.
  • Представление отвечает за визуальное отображение данных.
  • Контроллер преобразует входные данные в команды для Модели и Представления.

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

.NET Framework для пользователей.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.

Разница между CMS, фреймворками и написание кода с нуля

Разбираем на примере фронтенд-разработки. Предположим, вам нужно создать сайт. Есть 3 подхода, которые можно использовать: написать код с нуля, использовать framework или использовать CMS.

  • Написать код с нуля. Открыть блокнот и с чистой строки написать весь сайт. Это удобно: можно сделать абсолютно все под себя. Ровно так, как вам нужно. Можно использовать любые технологии.Проведем аналогию с рисованием. Написать код с нуля — это как оказаться перед абсолютно чистым листом бумаги, имея под рукой все возможные инструменты рисования, от фломастеров до мелков. Полный полет фантазии.У этого подхода есть и минусы. Во-первых, это долго и дорого. Во-вторых, сложно. Нужно тщательно проверять работоспособность каждой функции, чтобы ничего не западало. В этом подходе высокий порог входа: разработчик-новичок не сможет создать полноценный продукт с нуля. Цена каждой ошибки высока.
  • Использовать CMS. Возможно, вы слышали названия самых популярных из них: WordPress, Joomla, Drupal. Использование CMS — это почти противоположный вариант первому. Создать сайт с использованием CMS может любой уверенный пользователь компьютера, ему даже не обязательно быть разработчиком.CMS — это, по сути, уже готовый сайт. Вам остается только наполнить его содержанием: загрузить текст, картинки, видео и любой другой контент. И настроить внешний вид: шрифты, цвета, стили и другое. Если продолжать аналогию с рисованием, то использование CMS — это раскраска. За вас уже все нарисовали, промахнуться невозможно. Осталось только выбрать цвет фломастера и закрасить нужные части рисунка.
  • Использовать framework. Framework — это промежуточный вариант по гибкости и сложности между написанием кода с нуля и использованием CMS. Если написание кода с нуля — это рисование любыми инструментами на чистом листе бумаги, а использование CMS — раскраска, то использование framework — это рисование в блокноте в клеточку. С одной стороны, вы все еще можете нарисовать что угодно и как угодно. С другой, уже есть направляющие линии и границы блокнота, так что рисовать проще.

Типы веб-фреймворков

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

Бэкенд-фреймворки

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

  • Django — Python;
  • Symfony, Laravel — PHP;
  • Express.js — JavaScript;
  • Ruby on Rails — Ruby.

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

Фронтенд-фреймворки

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

  • Angular;
  • Vue.js;
  • Svelte;
  • React — формально это не фреймворк, а библиотека, но значение этого инструмента так велико, что его постоянно сравнивают с другими веб-фреймворками.

Все эти инструменты используют JavaScript.

Фуллстек-фреймворки

Если фреймворк решает задачи и на серверной, и на клиентской стороне, то он относится к категории фуллстек. В качестве примера можно назвать Meteor. Обе его стороны — серверная и клиентская — работают на JavaScript. Поэтому вы можете создавать и использовать для них один и тот же код. Следующая особенность — «режим реального времени». Когда вы что-то меняете в одном интерфейсе, изменения происходят и в остальных.

К фуллстек также относятся фреймворки Next.js и Nuxt. Первый создан поверх React.js, а второй работает на базе Vue.js. Такие веб-фреймворки могут быть сложными для начинающих.

Можно работать и с серверной, и с клиентской стороной веб-приложения

Фреймворки и микрофреймворки

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

«Летние программы Intel»

1 июля – 26 августа, Онлайн, Беcплатно

tproger.ru

События и курсы на tproger.ru

Например, если ваше приложение основано на Django и вам нужны веб-сокеты, то вы можете воспользоваться микрофреймворком aiohttp. Другой пример: если ваше приложение не очень большое и вам нужна только простая маршрутизация URL и шаблоны с несложным контекстом, вы можете использовать Flask с Jinja2 (или другим шаблонизатором) вместо Django.

Своеобразные кодеки для программ

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

По сути, технология Фреймворк представляется в виде своеобразных кодеков для сети Интернет и определенных программ. С технической стороны, инструмент NET Framework предназначен для совместимости служб, которые были написаны разными языками программирования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector