Mobile
Moving a Xamarin App to .NET MAUI: How We Do It, Step by Step
By Tayyab Zia, Head Software Engineer · Reviewed by Azmat Rana
- October 12, 2026
- 7 min read
- 8 sections
If your app is built on Xamarin.Forms and your team writes C#, move it to .NET MAUI. Microsoft built MAUI as the next version of Xamarin.Forms, so most of your code carries over. We moved a client’s Xamarin.Forms app to .NET MAUI in under three months. Here is the order we work in, and the changes that go beyond renaming namespaces.
01Why a Xamarin app can’t stay where it is
Microsoft ended support for all Xamarin SDKs on May 1, 2024. The last versions target Xcode 15 and Android API 34, and no newer ones are coming.
The app stores have moved past both. Since April 24, 2025, Apple has required Xcode 16 or later for every upload to App Store Connect. Since August 31, 2025, Google Play has required new apps and updates to target Android 15, which is API 35. A Xamarin app still runs on phones, but it can no longer ship an update to either store.
02MAUI, Flutter or React Native?
Microsoft’s guidance is that Xamarin.Forms projects should move to .NET MAUI. The projects don’t need to be rewritten, and a multi-project solution doesn’t need to become a single project. Your C# models, view models, services and most of your XAML carry over.
Flutter or React Native means rebuilding every screen in another language. That can still be the right call if a redesign was planned anyway, or if your web team already works in React. We build in all three, so we read the code before recommending one.
03Step 1: Get the Xamarin app ready first
We don’t start in MAUI. We start by updating the app to Xamarin.Forms 5 and every package to its latest version, then check it still runs. Microsoft recommends this too, because it narrows the gap between the two APIs.
Then we list every NuGet package and check its Frameworks tab on nuget.org. A package is ready if it lists a .NET target for Android and iOS, such as net10.0-android and net10.0-ios. Each one that doesn’t has three options: recompile it if you own the code, find a newer release, or replace it. This list affects the timeline more than anything else.
04Step 2: Move the projects and rename the namespaces
Every project has to become an SDK-style project, the format all of .NET now uses. The simplest route is a new .NET MAUI class library with the same name as the Xamarin.Forms library. The old code, configuration and resources are then copied in.
The namespaces come next. Xamarin.Forms becomes Microsoft.Maui and Microsoft.Maui.Controls, and the XAML namespace changes to http://schemas.microsoft.com/dotnet/2021/maui. Xamarin.Essentials is now part of .NET MAUI, so its using statements can go.
Finally, each platform project gets a new entry point. The Android MainApplication and the iOS AppDelegate both call one shared MauiProgram class, which builds the app and registers its services.
05Step 3: Fix what behaves differently
Code that compiles can still look or act differently. These are the changes Microsoft documents, and we check for them on every screen.
1. A BoxView with no size set was 40 by 40 in Xamarin.Forms. In .NET MAUI it is 0 by 0, so it disappears.
2. Default padding, margins and spacing in layouts have changed. Pages can look cramped until the old values are set again.
3. OnAppearing no longer runs when the app comes back from the background. Code that relied on it moves to the Window lifecycle events.
4. Children are added with layout.Add, not layout.Children.Add. RelativeLayout survives only as a compatibility control, so we move those screens to Grid.
5. The Device class is replaced by smaller APIs, such as DeviceInfo.Platform and MainThread. Colors now use float values, and Color.FromArgb replaces Color.FromHex.
6. Custom renderers and effects need updating. We port renderers to .NET MAUI handlers, because .NET 11 drops the compatibility package that ran the old ones.
06Step 4: Keep your users’ data and logins
This step is the easiest to miss, and users notice it first. Xamarin.Forms stored settings in Application.Properties, which .NET MAUI replaces with Preferences. Xamarin.Essentials secure storage and version tracking data also need migrating.
Microsoft publishes migration code for all three. Without it, the new app can’t read what the old one saved, so people lose their settings or get signed out. We migrate this data on first launch, and test it by installing the new build over the old one.
07Step 5: Test and release it as an update
Before building, we delete the bin and obj folders and the Android Resource.designer.cs file, as Microsoft advises. Then we test on real iPhones and Android phones, not only simulators.
The new app keeps the old bundle ID, package name and signing keys. That way it reaches users as a normal update, with the same store listing and reviews. It goes to TestFlight and a Google Play testing track first, then out to everyone.
08How long it takes
A migration like this is a one to three month job for us, shorter than the three to six months most of our builds take. It is shorter because the business logic doesn’t change and the backend stays as it is.
Three things push it toward the long end: packages with no .NET version, custom renderers, and platform-specific code in the Android and iOS projects. Count those before you plan.