.NET MAUI shipped as generally available in May 2022. A year into GA, the picture is clearer: MAUI delivers on its cross-platform promise with caveats that matter in production.
MAUI builds iOS, Android, macOS, and Windows applications from a single C# and XAML codebase. The underlying architecture maps MAUI abstractions to each platform's native UI controls, meaning you get platform-native rendering rather than a web view. The developer model is consistent: one project, one programming model, four deployment targets.
At GA, MAUI shipped with known issues that made production deployment difficult for anything beyond simple applications. There were memory leaks in specific navigation patterns, inconsistent gesture handling between iOS and Android, and performance issues in complex layouts. .NET 7 addressed many of these issues.
In the first few months we ran into a nasty leak in the navigation stack that showed up only after a user bounced between pages a dozen times. The profiler reported the managed heap growing from 120 MB to 350 MB after 30 navigations, and the app would be killed by the OS on Android 12. The culprit was a static event handler attached to a page‑level view model that never got unsubscribed. Replacing the static subscription with a weak event pattern and adding a Dispose call in the page’s OnDisappearing hook shaved the memory usage back down to under 130 MB. That fix alone saved us a nightly crash that was happening at 2 am on our CI pipeline.
.NET 8 Preview substantially improved performance. For new projects, it's best to use .NET 7 MAUI or .NET 8 when it ships, rather than the original GA release.
Our CI/CD setup now pins the .NET SDK to 7.0.400 for the MAUI build and runs the .NET 8 preview only on a feature branch. We use GitHub Actions to spin up a Windows runner with Visual Studio 2022, then invoke the dotnet maui‑android and dotnet maui‑ios commands. For iOS signing we store the provisioning profile and certificate in Azure Key Vault and pull them at build time; a missed password rotation once caused a whole week of failed builds. Adding a step that runs the maui‑check tool caught version mismatches before they hit the device farm, which saved us a lot of debugging time.
Blazor Hybrid is a credible alternative for teams with web development expertise. It embeds a Blazor WebAssembly application in a native MAUI shell. The UI runs in a web view within a native frame, which is less performant than fully native MAUI but offers a shorter learning curve for web developers.
When we tried Blazor Hybrid for a ticket‑tracking tool we measured the UI thread time on a Pixel 5 and saw a 30 % increase compared with the same screen built in native MAUI. Memory usage was also roughly double, which mattered on lower‑end Android devices. The trade‑off was that we could reuse the existing Razor components and ship the same code to a web portal without any extra work. We mitigated the slowdown by moving heavy calculations out of the UI thread and using the .NET MAUI Community Toolkit to wrap native controls where we needed crisp responsiveness.
For line-of-business applications where performance is not critical, Blazor Hybrid can reach iOS, Android, and desktop from a single web UI codebase.
.NET MAUI is the successor to Xamarin.Forms, which ends support in May 2024. Migration from Xamarin.Forms to MAUI is mostly mechanical: the project structure changes, some namespace renames, and configuration differences, but the XAML UI code and C# business logic largely transfer intact.
The migration tooling provided by Microsoft covers most common cases. It's a good idea to start the migration before Xamarin.Forms loses support.