Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Migrate a large Xamarin.Forms application to .NET MAUI in stages: stabilize the Xamarin app, inventory its projects and dependencies, choose whether to retain platform-specific projects, convert eligible code, then compile and validate each target platform incrementally. A rewrite and a single-project redesign are not prerequisites. Microsoft ended support for all Xamarin SDKs, including Xamarin.Forms, on May 1, 2024, so the goal is a controlled move to a supported .NET platform—not a one-click framework swap.

What changes—and what does not—when you migrate

Microsoft’s migration guidance covers Xamarin.Forms and several other Xamarin project types. All projects must become SDK-style, but the guidance does not require rewriting the application or combining a multi-project solution into one multi-targeted project. You can retain separate platform projects or move to MAUI’s single-project structure. Microsoft’s Xamarin-to-.NET migration overview describes both routes.

That distinction matters for enterprise applications: framework migration and solution restructuring are separate decisions. Keep existing boundaries when they support independent platform ownership, release processes, or incremental validation; consolidate only when the benefits justify changing those boundaries.

Choose a migration shape that fits the solution

Microsoft documents both a multi-project route and a single-project route for Xamarin.Forms. Neither is established as universally better for enterprise apps. Compare how each fits your platform ownership, build and deployment arrangements, and capacity to restructure.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Consideration Multi-project MAUI Single-project MAUI
Project boundaries Retains explicit platform project boundaries while those projects are updated. Uses a new MAUI app project to bring together shared code and platform-specific files.
Migration work Updates native platform projects and then migrates the Xamarin.Forms library. Moves code, configuration, resources, and platform-specific logic into the MAUI project structure.
Platform-specific organization Platform-specific work remains associated with its platform project. Platform-specific code and resources are organized in platform folders within the MAUI project.
Best fit to assess Whether retaining existing project boundaries enables clearer ownership or incremental migration. Whether the team is ready to adopt a consolidated project layout and adjust its build processes.

These are structural trade-offs, not measured performance or delivery outcomes. See Microsoft’s multi-project migration guide and single-project migration guide. The latter page uses a .NET 9 view, so verify its instructions against the .NET and MAUI version selected for your project.

Prepare the application before changing frameworks

Establish a known-good Xamarin baseline

For an Upgrade Assistant migration, Microsoft requires Xamarin.Forms 4.8 or later and recommends Xamarin.Forms 5.0 with .NET Standard 2.0 or later for best success. Its guidance is to upgrade the existing application to Xamarin.Forms 5 first, confirm it still runs, and update dependencies before conversion. Record the builds, tests, platform behaviors, and release checks that currently demonstrate the app works; they will become comparison points during migration. Microsoft’s Upgrade Assistant guide explains these prerequisites and preparation steps.

Inventory projects, integrations, and dependencies

Map the solution before choosing a conversion route. Include the shared Forms libraries and each platform head, plus the elements that often determine the real work:

  • UWP projects, binding projects, and iOS extension projects.
  • Custom renderers, effects, native embedding, startup code, and other native integrations.
  • Platform-specific resources, configuration, build settings, signing, and release packaging.
  • Third-party packages and internal libraries, including the .NET-compatible version available for each.

Classify dependencies as compatible, requiring an update, requiring replacement, or needing investigation. A familiar package name does not establish that a Xamarin-era package works with the selected .NET target. Microsoft’s manual checklist includes updating or replacing dependencies that are not .NET-compatible.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Decide whether to use Upgrade Assistant

Upgrade Assistant can reduce repetitive conversion work for eligible projects; it does not complete or validate a large application migration. Microsoft describes it as updating project files and target frameworks, setting up UseMaui, changing packages, and updating namespaces. The same guidance says additional work is usually required after it runs.

Approach Useful when Important limitation
Upgrade Assistant followed by manual remediation The project is eligible and automating common project-file and namespace edits will make conversion more reviewable. The tool does not finish platform remediation or prove application behavior; review its output and continue with builds and tests.
Manual migration The solution needs deliberate control over project structure, or includes projects the assistant cannot upgrade. The team must perform and verify the documented project, package, code, and bootstrap changes itself.

The assistant is available as a Visual Studio extension on Windows and as a CLI tool for Windows and Mac in Microsoft’s documented setup. Its MAUI upgrade path does not support UWP projects, iOS extension projects, or binding projects. That is a limitation of this tool, not a claim that those project types have no manual migration route; consult the broader migration overview for project-type guidance. Keep automated changes in a reviewable branch or copy and inspect each conversion before proceeding.

Run the migration in controlled stages

  1. Freeze the baseline. Upgrade to Xamarin.Forms 5 where applicable, refresh dependencies, and verify the current application on its supported platforms. Save the build and test procedures the team trusts.
  2. Choose the project shape. Decide whether to preserve separate platform projects or adopt a single MAUI project. Base the choice on ownership, release processes, platform-specific code, and the feasibility of incremental work—not simply on the availability of the single-project option.
  3. Convert a representative slice. Start with a bounded, meaningful part of the app and its dependencies. Apply manual changes or run Upgrade Assistant for eligible projects, then review the result before expanding conversion across the solution.
  4. Resolve compile and API differences. Work through errors in small increments, separating project-system changes from XAML, API, dependency, and platform-integration fixes. Track affected shared code and platform-specific code separately so a fix for one target does not conceal a regression on another.
  5. Complete platform startup and packaging. Enable MAUI for each platform project on the multi-project route, update entry points, and configure app bootstrap. On the single-project route, move head-specific code into the appropriate platform folders and preserve custom startup behavior.
  6. Validate before migrating the next slice. Build and run on every supported target after each meaningful stage. Add the migrated area to the release checks only after its platform behavior and relevant enterprise integrations have been exercised.

Keep a migration log that ties each change to its owning project, affected targets, dependency decisions, and validation result. This is especially useful when a shared-code change compiles successfully but a native integration or release configuration still needs platform-specific work.

Audit XAML, APIs, and lifecycle behavior

Do not treat a successful project conversion as proof that Forms-era code behaves identically in MAUI. Microsoft identifies concrete differences to review; their impact depends on what the application uses.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

XAML namespace and API usage

  • The default XAML namespace changes from http://xamarin.com/schemas/2014/forms to http://schemas.microsoft.com/dotnet/2021/maui. Search XAML files and verify the resulting namespace declarations.
  • Color APIs move to Microsoft.Maui.Graphics.Color and Colors. Check code that creates, converts, compares, or shares colors across UI components.
  • Some layout overloads have been removed. Review compiler errors and layout construction code rather than assuming an old overload has a direct equivalent.
  • MAUI says the layout Children collection is for internal use; add children directly to the layout instead of manipulating that collection. Audit any code that reads or changes it.

The multi-project guide and single-project guide describe these migration differences.

Lifecycle, renderers, effects, and native embedding

Review lifecycle-dependent behavior explicitly. Microsoft documents a difference in OnAppearing behavior when an app returns from the background and directs MAUI developers to window lifecycle events for foreground notification. If the application refreshes credentials, reconnects services, resumes work, or restores state around foregrounding, test those flows rather than relying on the old callback’s behavior.

Custom renderers and native integrations also need individual review. Microsoft says renderers can be reused or migrated to handlers, and effects can be reused. Native forms became native embedding, with a different initialization approach. Inventory each implementation and decide whether reuse is appropriate or a handler migration is warranted; do not assume the framework conversion automatically preserves its initialization or behavior.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Make platform and enterprise validation part of the work

Compile and test against the actual target platforms throughout migration. A successful build establishes only that the project compiles for that target; it does not establish that authentication, offline behavior, device integration, platform lifecycle handling, or release packaging works. Use the baseline checks from the Xamarin app and add coverage for each changed integration.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Build matrix: record a successful build for each supported target and configuration, not only the developer’s most-used platform.
  • Behavior checks: exercise critical user journeys, especially those that depend on app resume, local data, native APIs, or platform-specific resources.
  • Integration checks: verify sign-in, service connectivity, device capabilities, and any internal or third-party library that changed.
  • Release checks: validate signing, packaging, configuration, and the deployment route used by the organization.
  • Failure ownership: assign unresolved package and platform issues to an owner, and keep them visible rather than treating a shared-project build as completion.

Plan effort from the application’s own inventory: dependency compatibility, platform integrations, renderer and customization use, build and release processes, and available test coverage. Microsoft’s migration material provides procedures and known considerations, not enterprise estimates for duration, staffing, savings, or defect rates; those outcomes cannot be inferred from a framework conversion guide.

Check version-specific instructions before applying examples

.NET and MAUI migration instructions can vary by target framework. Microsoft’s current multi-project page distinguishes package guidance for .NET 10 and earlier from .NET 11 and later, including the availability of a compatibility package. The single-project page linked above is shown with a .NET 9 view. Before applying a package or project-file example, check the corresponding instructions for the exact framework version selected for the application rather than copying a snippet from a different version’s view.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.