Старый смартфон с треснувшим экраном и новый смартфон с цветной абстрактной схемой, между ними светящаяся дуга, на фоне ноутбук: перенос мобильного приложения с Xamarin на .NET MAUI

Миграция с Xamarin.Forms на .NET MAUI: что сломается, сколько займёт и как перенести приложение

РубрикаМиграцияУровеньСредний Чтение14 минОпубликовано ТегиXamarin.NET MAUIМобильные приложенияМиграция

Поддержка Xamarin закончилась, Google Play требует target API 36, а App Center закрыт. Разбираем, когда переносить приложение на .NET MAUI, а когда переписывать, что меняется в проекте, как оценить рендереры и плагины, в каком порядке вести работы и что сделать с бизнес-логикой на VB.NET.

Главное. Поддержка Xamarin закончилась 1 мая 2024 года, а с 31 августа 2026 года Google Play принимает обновления только с target API 36, до которого Xamarin.Android уже не дорастёт. Для приложения на Xamarin.Forms с живой бизнес-логикой на C# обычно выгоднее всего миграция на .NET MAUI: проект переводят в SDK-формат, меняют пространства имён, переписывают кастомные рендереры на хендлеры и заменяют устаревшие плагины. Средний корпоративный клиент на 30–60 экранов переезжает за 1–3 месяца. Сроки определяют число рендереров и сторонних пакетов, а не количество экранов.

Мобильное приложение на 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 MAUIXamarin.Forms, бизнес-логика на C#, до 15–20 рендереровМодели, сервисы, ViewModel, большая часть XAMLЕжегодные обновления MAUI, отличия в отрисовке
Переход на нативные Android и iOS на .NETXamarin.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.configSDK-формат, PackageReference
Кастомизация контроловCustom RenderersHandlers и маппинг свойств
Платформенные сервисыDependencyServiceВстроенное внедрение зависимостей в MauiProgram.cs
Сообщения между модулямиMessagingCenterWeakReferenceMessenger из CommunityToolkit.Mvvm
Доступ к функциям устройстваПакет Xamarin.EssentialsВстроено в MAUI
СпискиListViewCollectionView (ListView оставлен для совместимости)
РаскладкиStackLayout с *AndExpandVerticalStackLayout, HorizontalStackLayout, Grid
РамкиFrameBorder (Frame устарел)

Пространство имён XAML меняется в каждом файле разметки, а в коде Xamarin.Forms заменяется на Microsoft.Maui и Microsoft.Maui.Controls:

MainPage.xamlXAML
<!-- 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">

Механическую часть (пространства имён, формат проекта, ссылки на пакеты) берут на себя инструменты. Всё остальное — ручная работа, и именно она определяет сроки.

Как оценить объём миграции до начала работ?

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

Что посчитать при инвентаризации

  1. Версия Xamarin.Forms. Если она ниже 5.0, сначала обновите проект до Xamarin.Forms 5 и убедитесь, что он собирается и работает. Microsoft называет это обязательным первым шагом.
  2. Кастомные рендереры и эффекты. Найдите все классы, наследующие *Renderer и PlatformEffect, и оцените сложность каждого: поменять цвет подчёркивания или полностью нарисовать свой контрол — разные задачи.
  3. NuGet-пакеты и плагины. Выпишите все зависимости и для каждой найдите версию под MAUI или замену. Пакеты без замены — главный риск проекта.
  4. Вызовы DependencyService и MessagingCenter. Их число показывает, сколько работы будет по переходу на внедрение зависимостей.
  5. Платформенный код. Работа с камерой, Bluetooth, сканерами штрихкодов, фоновыми задачами, push-уведомлениями.
  6. Тесты. Если модульных тестов на бизнес-логику нет, напишите хотя бы базовые до начала переноса. Подход для старого кода описан в статье о модульных тестах для legacy-кода.

Сколько занимает перенос рендереров

Отраслевое руководство Talk Think Do даёт такой ориентир только по рендерерам, без остальной миграции:

Кастомных рендереровСрок на их переносВывод
0–51–2 неделиМиграция почти механическая
6–152–4 неделиТипичный корпоративный проект
16–304–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 до поэтапного выпуска. Порядок подходит большинству корпоративных приложений:

  1. Заморозьте функциональность. На время миграции новые функции не добавляются, только критические исправления в старой ветке.
  2. Обновите до Xamarin.Forms 5 и последних версий пакетов, которые ещё поддерживают Xamarin. Зафиксируйте рабочую сборку как точку отката.
  3. Создайте новый проект MAUI или переведите существующие в SDK-формат. Один мультиплатформенный проект удобнее, но мультипроектная схема тоже поддерживается и требует меньше перестройки.
  4. Перенесите общий код. Модели, сервисы, ViewModel, конвертеры. Замените пространства имён и вызовы Xamarin.Essentials.
  5. Перенесите XAML-страницы и исправьте раскладки: *AndExpand, Frame, ListView с разной высотой строк.
  6. Перенесите DependencyService на внедрение зависимостей. Регистрация сервисов — в MauiProgram.cs, получение — через конструктор.
  7. Перепишите рендереры на хендлеры (подробнее ниже). Временно можно подключить старые рендереры через слой совместимости.
  8. Замените плагины и сервис аналитики сбоев вместо App Center.
  9. Проверьте на реальных устройствах всех поддерживаемых версий Android и iOS, включая слабые модели, которые есть у сотрудников.
  10. Выпустите поэтапно: внутреннее тестирование, затем 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:

MauiProgram.csC#
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.CommunityToolkitCommunityToolkit.Maui
Xam.Plugin.MediaMediaPicker, встроенный в MAUI
Rg.Plugins.PopupPopup из CommunityToolkit.Maui или Mopups
Acr.UserDialogsDisplayAlert и DisplayActionSheet или Popup из CommunityToolkit.Maui
MessagingCenterWeakReferenceMessenger из CommunityToolkit.Mvvm
Prism.FormsPrism.Maui
SkiaSharp.Views.FormsSkiaSharp.Views.Maui
App Center Crashes и AnalyticsSentry, 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

  1. приложение обновлено до Xamarin.Forms 5 и собирается, рабочая сборка сохранена как точка отката;
  2. составлен список кастомных рендереров и эффектов с оценкой сложности каждого;
  3. для каждого NuGet-пакета найдена версия под MAUI или замена;
  4. бизнес-логика покрыта базовыми модульными тестами;
  5. выбрана структура проекта: один мультиплатформенный или мультипроектный;
  6. DependencyService и MessagingCenter заменены на внедрение зависимостей и WeakReferenceMessenger;
  7. рендереры переписаны на хендлеры или временно подключены через слой совместимости;
  8. App Center заменён другим сервисом отчётов о сбоях;
  9. target API Android соответствует текущему требованию Google Play, сборка iOS собрана актуальным Xcode;
  10. идентификатор пакета и ключ подписи совпадают со старой версией;
  11. ключевые экраны сверены визуально на реальных устройствах, замерены запуск и прокрутка списков;
  12. выпуск идёт поэтапно, в бюджет заложено ежегодное обновление версии MAUI.

Как это делают сегодня

В конце 2026 года Xamarin-приложения переводят на .NET MAUI 10 или сразу на MAUI 11, вышедшую 10 ноября. Механику (формат проекта, пространства имён, ссылки на пакеты) берёт на себя агент GitHub Copilot app modernization или ручной перенос по документации Microsoft. Основное время уходит на хендлеры вместо рендереров, замену плагинов и визуальную сверку на устройствах. После выпуска команда раз в год обновляет приложение на следующую версию MAUI, чтобы оставаться в окне поддержки и требованиях Google Play.

Вопросы и ответы о миграции с 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 года. Поэтому после миграции приложение нужно обновлять на следующую версию раз в год.

Читайте также