
Миграция с Xamarin.Forms на .NET MAUI: что сломается, сколько займёт и как перенести приложение
Поддержка Xamarin закончилась, Google Play требует target API 36, а App Center закрыт. Разбираем, когда переносить приложение на .NET MAUI, а когда переписывать, что меняется в проекте, как оценить рендереры и плагины, в каком порядке вести работы и что сделать с бизнес-логикой на VB.NET.
Мобильное приложение на Xamarin.Forms, написанное в 2017–2020 годах, часто работает до сих пор: курьеры отмечают доставки, торговые представители собирают заказы, инженеры заполняют акты на объекте. Код никто не трогал годами, потому что повода не было. Теперь повод есть: Microsoft больше не выпускает для Xamarin обновлений, а магазины приложений поднимают требования каждый год. Миграция с Xamarin на .NET MAUI — самый короткий путь сохранить приложение и его бизнес-логику, не переписывая всё с нуля.
Если своей мобильной команды в компании нет, миграцию и дальнейшую поддержку мобильного приложения обычно отдают подрядчику: он инвентаризирует проект, оценивает рендереры и плагины, переносит код и выпускает сборки в Google Play, App Store и RuStore. От вас нужны исходники, доступы к аккаунтам разработчика и человек, который знает, как приложением пользуются в поле.
Если приложение не мобильное, а десктопное на VB6 или WinForms, читайте отдельный разбор о том, как перенести десктопное приложение на телефон.
Почему приложение на Xamarin нельзя оставить как есть?
Приложение на Xamarin нельзя оставить без изменений, потому что его скоро невозможно будет обновить в магазинах. Сама программа на устройствах пользователей не сломается в один день. Ломается цепочка выпуска: вы не сможете отправить исправление ошибки или новую функцию.
- Поддержка закончилась. По политике поддержки Xamarin все Xamarin SDK, включая Xamarin.Forms, не получают обновлений и исправлений безопасности с 1 мая 2024 года.
- Google Play требует новый target API. С 31 августа 2026 года новые приложения и обновления для телефонов должны целиться в Android 16 (API 36), продление можно было запросить до 1 ноября 2026 года. Приложения, которые целятся ниже API 35, не видны новым пользователям на свежих версиях Android. Требования описаны на странице Google Play о target API. Xamarin.Android новые уровни API уже не получит.
- Apple поднимает требования к Xcode и SDK. Для загрузки в App Store нужна свежая версия Xcode, а Xamarin.iOS с новыми версиями Xcode не работает.
- Visual Studio App Center закрыт. Многие Xamarin-приложения отправляли туда отчёты о сбоях и аналитику, а тестовые сборки раздавали через него же. Сервис закрыт 31 марта 2025 года, и SDK внутри приложения теперь просто ничего не отправляет.
- Библиотеки ушли вперёд. Авторы плагинов перестали выпускать версии под Xamarin.Forms. Уязвимость в старом HTTP-клиенте или библиотеке авторизации не исправить обновлением пакета.
Чем это грозит бизнесу
Итог простой: пока приложение работает, его можно не трогать, но первое обязательное обновление (смена API сервера, новая версия Android у сотрудников, требование магазина) превращается в аварийный проект. Миграцию дешевле провести по плану.
Мигрировать на .NET MAUI или переписать приложение?
Мигрировать на .NET MAUI стоит, если в приложении много бизнес-логики на C# и интерфейс в целом устраивает пользователей. Переписывать — если интерфейс устарел, кастомных рендереров десятки или у компании уже есть мобильная команда на другом стеке. Microsoft прямо пишет в руководстве по переходу с Xamarin, что проекты не нужно переписывать: их нужно перевести в SDK-формат и обновить зависимости.
| Вариант | Когда подходит | Что сохраняется | Риск |
|---|---|---|---|
| Миграция на .NET MAUI | Xamarin.Forms, бизнес-логика на C#, до 15–20 рендереров | Модели, сервисы, ViewModel, большая часть XAML | Ежегодные обновления MAUI, отличия в отрисовке |
| Переход на нативные Android и iOS на .NET | Xamarin.Android и Xamarin.iOS без Forms | Почти весь код, меняется формат проекта | Две кодовые базы интерфейса, как и раньше |
| Переписать на Flutter или натив | Сложный кастомный UI, 30+ рендереров, своя мобильная команда | Только серверное API и требования | Дольше и дороже, бизнес-логику переносят заново |
| PWA вместо приложения | Простые формы, нет офлайна, камеры и Bluetooth | Серверное API | Ограничения браузера на iOS, нет фоновой работы |
Сколько живёт версия .NET MAUI
MAUI — не одноразовый переезд. Каждая версия .NET MAUI поддерживается около 18 месяцев. По политике поддержки MAUI версия 10 вышла 11 ноября 2025 года и поддерживается до 11 мая 2027 года, версия 11 вышла 10 ноября 2026 года и поддерживается до 9 мая 2028 года. Закладывайте в бюджет ежегодное обновление на следующую версию: оно занимает дни, а не месяцы, но пропускать его нельзя. Подробнее о том, что принесла версия 11, мы писали в обзоре .NET Conf 2026 и MAUI на CoreCLR.
Что меняется при переходе с Xamarin.Forms на .NET MAUI?
.NET MAUI — прямой наследник Xamarin.Forms, поэтому XAML, привязки данных и MVVM остаются на месте. Меняются структура проекта, пространства имён, механизм кастомизации контролов и часть стандартных элементов.
| Что | Xamarin.Forms | .NET MAUI |
|---|---|---|
| Структура решения | Общий проект и отдельные проекты Android и iOS | Один мультиплатформенный проект или прежняя мультипроектная схема |
| Формат проекта | Старый .csproj, packages.config | SDK-формат, PackageReference |
| Кастомизация контролов | Custom Renderers | Handlers и маппинг свойств |
| Платформенные сервисы | DependencyService | Встроенное внедрение зависимостей в MauiProgram.cs |
| Сообщения между модулями | MessagingCenter | WeakReferenceMessenger из CommunityToolkit.Mvvm |
| Доступ к функциям устройства | Пакет Xamarin.Essentials | Встроено в MAUI |
| Списки | ListView | CollectionView (ListView оставлен для совместимости) |
| Раскладки | StackLayout с *AndExpand | VerticalStackLayout, HorizontalStackLayout, Grid |
| Рамки | Frame | Border (Frame устарел) |
Пространство имён XAML меняется в каждом файле разметки, а в коде Xamarin.Forms заменяется на Microsoft.Maui и Microsoft.Maui.Controls:
<!-- Xamarin.Forms -->
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<!-- .NET MAUI -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">Механическую часть (пространства имён, формат проекта, ссылки на пакеты) берут на себя инструменты. Всё остальное — ручная работа, и именно она определяет сроки.
Как оценить объём миграции до начала работ?
Объём миграции оценивают по инвентаризации проекта, а не по числу экранов. Экран из стандартных контролов переносится почти без правок, а один сложный кастомный рендерер может занять неделю.
Что посчитать при инвентаризации
- Версия Xamarin.Forms. Если она ниже 5.0, сначала обновите проект до Xamarin.Forms 5 и убедитесь, что он собирается и работает. Microsoft называет это обязательным первым шагом.
- Кастомные рендереры и эффекты. Найдите все классы, наследующие
*RendererиPlatformEffect, и оцените сложность каждого: поменять цвет подчёркивания или полностью нарисовать свой контрол — разные задачи. - NuGet-пакеты и плагины. Выпишите все зависимости и для каждой найдите версию под MAUI или замену. Пакеты без замены — главный риск проекта.
- Вызовы DependencyService и MessagingCenter. Их число показывает, сколько работы будет по переходу на внедрение зависимостей.
- Платформенный код. Работа с камерой, Bluetooth, сканерами штрихкодов, фоновыми задачами, push-уведомлениями.
- Тесты. Если модульных тестов на бизнес-логику нет, напишите хотя бы базовые до начала переноса. Подход для старого кода описан в статье о модульных тестах для legacy-кода.
Сколько занимает перенос рендереров
Отраслевое руководство Talk Think Do даёт такой ориентир только по рендерерам, без остальной миграции:
| Кастомных рендереров | Срок на их перенос | Вывод |
|---|---|---|
| 0–5 | 1–2 недели | Миграция почти механическая |
| 6–15 | 2–4 недели | Типичный корпоративный проект |
| 16–30 | 4–6 недель | Нужен поэтапный план |
| Больше 30 | От 6 недель | Стоит сравнить с переписыванием |
Там же оценка для приложения средней сложности (30–60 экранов, 10–20 рендереров): 4–8 недель на всю миграцию. Живой пример на русском — разбор на Хабре: около 45 тысяч строк C# и XAML, 18 пакетов сократились до 6, шесть кастомных рендереров и рендерер камеры свелись к одному хендлеру. На проект ушло три попытки и семь месяцев, потому что его вёл один разработчик, параллельно изучая MAUI. Общий подход к оценке legacy-проектов разобран в статье о стоимости миграции.
В каком порядке переносить приложение с Xamarin.Forms на .NET MAUI?
Переносить приложение с Xamarin.Forms на .NET MAUI лучше в десять шагов: от заморозки функциональности и обновления до Xamarin.Forms 5 до поэтапного выпуска. Порядок подходит большинству корпоративных приложений:
- Заморозьте функциональность. На время миграции новые функции не добавляются, только критические исправления в старой ветке.
- Обновите до Xamarin.Forms 5 и последних версий пакетов, которые ещё поддерживают Xamarin. Зафиксируйте рабочую сборку как точку отката.
- Создайте новый проект MAUI или переведите существующие в SDK-формат. Один мультиплатформенный проект удобнее, но мультипроектная схема тоже поддерживается и требует меньше перестройки.
- Перенесите общий код. Модели, сервисы, ViewModel, конвертеры. Замените пространства имён и вызовы Xamarin.Essentials.
- Перенесите XAML-страницы и исправьте раскладки:
*AndExpand,Frame,ListViewс разной высотой строк. - Перенесите DependencyService на внедрение зависимостей. Регистрация сервисов — в
MauiProgram.cs, получение — через конструктор. - Перепишите рендереры на хендлеры (подробнее ниже). Временно можно подключить старые рендереры через слой совместимости.
- Замените плагины и сервис аналитики сбоев вместо App Center.
- Проверьте на реальных устройствах всех поддерживаемых версий Android и iOS, включая слабые модели, которые есть у сотрудников.
- Выпустите поэтапно: внутреннее тестирование, затем 10–20 % пользователей, затем все.
Какие инструменты помогают при переносе
Инструменты помогают на шагах 3–4. Бесплатный .NET Upgrade Assistant официально объявлен устаревшим: Microsoft рекомендует вместо него агента GitHub Copilot app modernization, для которого нужна платная подписка Copilot. Как работает этот агент на legacy-проектах, мы разбирали в статье о Copilot upgrade agent. Любой инструмент выдаёт проект, который собирается не сразу: после него остаётся ручная доводка.
Как переписать кастомные рендереры на хендлеры?
Кастомные рендереры переписывают на хендлеры: вместо отдельного класса-наследника для каждой платформы вы дописываете маппинг свойства к стандартному хендлеру контрола. Это самое крупное изменение при переходе и самая трудоёмкая часть работ.
Типичный пример: в Xamarin.Forms убрать подчёркивание у поля ввода на Android требовало отдельного класса EntryRenderer с атрибутом ExportRenderer. В MAUI это несколько строк в MauiProgram.cs:
Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("NoUnderline", (handler, view) =>
{
#if ANDROID
handler.PlatformView.BackgroundTintList =
Android.Content.Res.ColorStateList.ValueOf(Android.Graphics.Color.Transparent);
#endif
});Маппинг применяется ко всем полям ввода в приложении. Если кастомизация нужна только части полей, создайте наследника Entry и проверяйте тип в обработчике.
Как переносить рендереры без остановки работ
Переносить все рендереры сразу необязательно. MAUI умеет подключать старые рендереры через слой совместимости (UseMauiCompatibility и регистрация в ConfigureMauiHandlers), поэтому сначала можно запустить приложение со старыми рендерерами, а затем переписывать их по одному. Начинайте с простых: цвета, отступы, подчёркивания. Сложные контролы, которые рисуют всё сами, оставьте на конец и проверьте, нет ли готовой замены в CommunityToolkit.Maui или у поставщика компонентов.
Чем заменить плагины и пакеты Xamarin?
Часть популярных плагинов Xamarin встроена в MAUI, для остальных есть официальные или поддерживаемые сообществом версии. Перед началом работ составьте такую таблицу для своего проекта:
| Было в Xamarin | Замена в .NET MAUI |
|---|---|
| Xamarin.Essentials | Встроено в MAUI (пространства имён Microsoft.Maui.*) |
| Xamarin.CommunityToolkit | CommunityToolkit.Maui |
| Xam.Plugin.Media | MediaPicker, встроенный в MAUI |
| Rg.Plugins.Popup | Popup из CommunityToolkit.Maui или Mopups |
| Acr.UserDialogs | DisplayAlert и DisplayActionSheet или Popup из CommunityToolkit.Maui |
| MessagingCenter | WeakReferenceMessenger из CommunityToolkit.Mvvm |
| Prism.Forms | Prism.Maui |
| SkiaSharp.Views.Forms | SkiaSharp.Views.Maui |
| App Center Crashes и Analytics | Sentry, Firebase Crashlytics или другой сервис сбоев |
Отдельно проверьте коммерческие наборы компонентов (Telerik, Syncfusion, DevExpress): у всех есть версии под MAUI, но лицензия под Xamarin на них может не распространяться. Если компонент не перенесён и замены нет, это повод вернуться к вопросу о переписывании экрана.
Что делать с бизнес-логикой на VB.NET?
Бизнес-логику на VB.NET можно сохранить, если она лежит в отдельной библиотеке классов без зависимости от интерфейса. Шаблонов MAUI для Visual Basic нет, и XAML-страницы с code-behind придётся писать на C#. Но проект MAUI может ссылаться на библиотеку VB.NET, собранную под .NET Standard 2.0 или под текущую версию .NET.
Такое встречается в компаниях, где мобильный клиент делали те же люди, что сопровождают десктоп на VB.NET: расчёты, правила валидации и работа с API жили в общей библиотеке. План для этого случая:
- переведите библиотеку VB.NET в SDK-формат и соберите под
netstandard2.0илиnet10.0; - уберите из неё ссылки на
System.Windows.Forms, реестр Windows и другие API, которых нет на Android и iOS; - покройте её тестами, чтобы при переносе было видно, что расчёты не изменились;
- новый интерфейс и платформенный код пишите на C#.
Если библиотека тянет за собой WinForms или COM, проще переписать нужные классы на C#. Как переводить сам десктоп на VB.NET на современный .NET, мы разбирали в статье о переходе WinForms на новый .NET.
Как протестировать и выпустить мигрированное приложение?
Мигрированное приложение тестируют как новое: даже при похожем коде MAUI рисует интерфейс иначе, и регрессии чаще всего видны глазами, а не в логах.
- Визуальная сверка. Сделайте снимки ключевых экранов в старой версии и сравните с новой на тех же устройствах. Отступы, шрифты и высота строк расходятся почти всегда.
- Производительность списков. Длинные списки с разной высотой строк — частая проблема после перехода с ListView. Проверьте прокрутку на слабом Android-устройстве.
- Время запуска. Холодный старт на Android может оказаться медленнее, чем в Xamarin. Замерьте его до и после и при необходимости включите профилирование запуска.
- Офлайн и синхронизация. Если приложение работает без сети, проверьте, что локальная база (обычно SQLite) открывается без потери данных после обновления с версии на Xamarin.
- Обновление поверх старой версии. Сохраните идентификатор пакета и ключ подписи. Иначе магазин увидит новое приложение, а пользователи потеряют данные.
Выпуск делайте поэтапно: внутреннее тестирование в Google Play Console и TestFlight, затем постепенное развёртывание на часть пользователей. Для корпоративных приложений, которые раздают через MDM, договоритесь с ИТ-службой о пилотной группе.
Кто делает миграцию и сколько это стоит?
Миграцию делает команда из мобильного разработчика на .NET, тестировщика с набором реальных устройств и аналитика или владельца продукта со стороны заказчика. Для небольшого приложения хватает одного опытного разработчика, для крупного нужны двое-трое, чтобы параллельно переносить экраны и рендереры.
| Размер приложения | Рендереров и плагинов | Срок |
|---|---|---|
| Небольшое: до 20 экранов | До 5 рендереров, типовые плагины | 3–6 недель |
| Среднее: 30–60 экранов | 10–20 рендереров, офлайн, камера | 2–3 месяца |
| Крупное: 60+ экранов, интеграции с оборудованием | 20+ рендереров, свои контролы | 3–6 месяцев, поэтапно |
Это ориентиры для команды, которая уже переводила проекты на MAUI. Если разработчик осваивает MAUI по ходу, сроки заметно растут, как в примере с Хабра. Своими силами миграцию стоит вести, если в штате есть разработчик, который знает и Xamarin, и MAUI. Подрядчик выгоднее, когда приложение критично для работы и простой недопустим или когда после миграции нужна регулярная поддержка с ежегодным обновлением версий.
Типичные ошибки при миграции с Xamarin
- Мигрировать с Xamarin.Forms 4.x напрямую. Сначала обновление до версии 5, иначе ошибки двух переходов смешаются.
- Совмещать миграцию с редизайном. Новый интерфейс и новый фреймворк одновременно делают невозможным сравнение «было — стало». Сначала перенос, потом улучшения.
- Верить, что инструмент сделает всё. После Upgrade Assistant или агента Copilot проект собирается не сразу, а визуальные отличия инструмент не видит.
- Забыть про App Center. Без замены отчётов о сбоях первые проблемы после выпуска вы узнаете от пользователей.
- Сменить ключ подписи или идентификатор пакета. Магазин не примет обновление, а у пользователей не перенесутся локальные данные.
- Не планировать обновление MAUI. Через полтора года после выпуска версия MAUI теряет поддержку, и проблема повторится, если не обновляться раз в год.
Чек-лист миграции Xamarin.Forms на .NET MAUI
- приложение обновлено до Xamarin.Forms 5 и собирается, рабочая сборка сохранена как точка отката;
- составлен список кастомных рендереров и эффектов с оценкой сложности каждого;
- для каждого NuGet-пакета найдена версия под MAUI или замена;
- бизнес-логика покрыта базовыми модульными тестами;
- выбрана структура проекта: один мультиплатформенный или мультипроектный;
- DependencyService и MessagingCenter заменены на внедрение зависимостей и WeakReferenceMessenger;
- рендереры переписаны на хендлеры или временно подключены через слой совместимости;
- App Center заменён другим сервисом отчётов о сбоях;
- target API Android соответствует текущему требованию Google Play, сборка iOS собрана актуальным Xcode;
- идентификатор пакета и ключ подписи совпадают со старой версией;
- ключевые экраны сверены визуально на реальных устройствах, замерены запуск и прокрутка списков;
- выпуск идёт поэтапно, в бюджет заложено ежегодное обновление версии MAUI.
Как это делают сегодня
Вопросы и ответы о миграции с Xamarin на .NET MAUI
Можно ли оставить приложение на Xamarin и ничего не делать?
Работать на устройствах оно продолжит, но выпускать обновления станет невозможно: с 31 августа 2026 года Google Play принимает обновления только с target API 36, а Xamarin.Android новые уровни API не получит. Первое обязательное исправление превратится в аварийную миграцию.
Сколько времени занимает миграция с Xamarin.Forms на .NET MAUI?
Небольшое приложение до 20 экранов переносят за 3–6 недель, среднее на 30–60 экранов с 10–20 кастомными рендерерами — за 2–3 месяца. Срок определяют число рендереров и сторонних пакетов без замены, а не количество экранов.
Нужно ли переписывать приложение с нуля?
Обычно нет. Microsoft указывает, что проекты Xamarin не нужно переписывать: их переводят в SDK-формат и обновляют зависимости. Переписывание оправдано при 30 и более сложных рендерерах, устаревшем интерфейсе или если у компании уже есть мобильная команда на другом стеке.
Поддерживает ли .NET MAUI язык Visual Basic?
Шаблонов MAUI для Visual Basic нет, страницы и платформенный код пишут на C#. Но проект MAUI может ссылаться на библиотеку классов VB.NET под .NET Standard 2.0 или современный .NET, если в ней нет зависимостей от WinForms и Windows API.
Как долго поддерживается версия .NET MAUI?
Каждая версия поддерживается около 18 месяцев: MAUI 10 — до 11 мая 2027 года, MAUI 11 — до 9 мая 2028 года. Поэтому после миграции приложение нужно обновлять на следующую версию раз в год.