Introducing .NET MAUI – One Codebase, Many Platforms

David Ortinau

Welcome to .NET Multi-platform App UI. This release marks a new milestone in our multi-year journey to unify the .NET platform. Now you and over 5 million other .NET developers have a first-class, cross-platform UI stack targeting Android, iOS, macOS, and Windows to complement the .NET toolchain (SDK) and base class library (BCL). You can build anything with .NET.

Join us at Microsoft Build 2022 where we’ll give you a tour of all the updates for building native apps for any device with .NET and Visual Studio. » Learn more.

This is just the beginning of our journey to create a desktop and mobile app experience that delights .NET developers. For the next phase, the foundation is now established for the broader .NET ecosystem to bring plugins, libraries, and services from .NET Framework and the old project system to .NET 6 and SDK style projects. Among those available today are:

syncfusion controls for dot net maui telerik controls for dot net maui
DevExpress controls for dot net maui grial kit controls for .NET MAUI
AndroidX AlohaKit CommunityToolkit.MVVM CommunityToolkit.Maui CommunityToolkit MauiCompat CommunityToolkit Markup.MauiCompat DevExpress Facebook FreshMvvm.Maui Google APIs for iOS Google Play Services Client Libraries GrialKit MauiAnimation Microsoft.Maui.Graphics MR.Gestures Prism.Maui Plugin.Fingerprint Plugin.InAppBilling Plugin.StoreReview Plugin.ValidationRules ReactiveUI.Maui Shiny SkiaSharp Syncfusion Telerik UI for .NET MAUI TemplateUI User Dialogs

For help moving libraries to .NET 6, check out the recent guest blog posts detailing experiences shipping .NET MAUI libraries from Michael Rumpler (MR.Gestures) and Luis Matos (Plugin.ValidationRules).

The .NET MAUI workload is fully supported under the Current release schedule of 18 months, and will be serviced at the same monthly cadence as .NET. Our ongoing focus for .NET MAUI continues to be quality, resolving known issues and prioritizing issues based on your feedback. This also includes the workloads we ship for building applications that exclusively target Android, Android Wear, CarPlay, iOS, macOS, and tvOS directly using the native toolkits from .NET, and the supporting libraries AndroidX, Facebook, Firebase, Google Play Services, and SkiaSharp.

With .NET MAUI you can achieve no-compromise user experiences while sharing more code than ever before. .NET MAUI uses native UI via the premier app toolkits provided by each platform, modern developer productivity, and our fastest mobile platform yet.

Native UI, No Compromise

The primary goal of .NET MAUI is to enable you to deliver the best app experience as designed specially by each platform (Android, iOS, macOS, Windows, and Tizen thanks to collaboration with Samsung), while enabling you to craft consistent brand experiences through rich styling and graphics. Out of the box, each platform looks and behaves the way it should without any additional widgets or styling required to mimic. For example, .NET MAUI on Windows is backed by WinUI 3 the premier native UI component that ships with the Windows App SDK.

app UI on all four supported platforms

Use C# and XAML to build your apps from a rich toolkit of more than 40 controls, layouts, and pages. Upon the Xamarin shoulders of mobile controls, .NET MAUI adds support for multi-window desktop applications, menu bars, and new animation capabilities, borders, corners, shadows, graphics, and more. Oh, and the new BlazorWebView which I’ll highlight below.

Image controls sample png

Read more in the .NET MAUI documentation about controls: pages, layouts, and views.

Accessibility First

One major advantage of using native UI is the inherited accessibility support that we can build upon with semantic services to make it easier than ever to create highly accessible applications. We have worked closely with customers to redesign how we develop for accessibility. From these conversations we have designed .NET MAUI semantic services for controlling:

  • Properties such as description, hint, and heading level
  • Focus
  • Screen reader
  • Automation properties

Read more in the .NET MAUI documentation about semantic services for accessibility.

Beyond UI

.NET MAUI provides simple APIs to access services and features of each platform such as accelerometer, app actions, file system, notifications, and so much more. In this example, we configure “app actions” that add menu options to the app icon on each platform:

AppActions.SetAsync(
    new AppAction("current_info", "Check Current Weather", icon: "current_info"),
    new AppAction("add_location", "Add a Location", icon: "add_location")
);

Image platform integrations png

Read more in the .NET MAUI documentation about accessing platform services and features.

Easily Customized

Whether you’re extending the capabilities of .NET MAUI controls or establishing new platform functionality, .NET MAUI is architected for extensibility, so you never hit a wall. Take, for example, the Entry control – a canonical example of a control that renders differently on one platform. Android draws an underline below the text field, and developers often want to remove that underline. With .NET MAUI, customizing every Entry in your entire project is just a few lines of code:

#if ANDROID
Microsoft.Maui.Handlers.EntryHandler.Mapper.ModifyMapping("NoUnderline", (h, v) =>
{
    h.PlatformView.BackgroundTintList = ColorStateList.ValueOf(Colors.Transparent.ToPlatform());
});
#endif

android default entry control compared to a styled entry control

Here is a great recent example of creating a new Map platform control by Cayas Software. The blog post demonstrates creating a handler for the control, implementation for each platform, and then making the control available by registering it in .NET MAUI.

.ConfigureMauiHandlers(handlers =>
{
    handlers.AddHandler(typeof(MapHandlerDemo.Maps.Map),typeof(MapHandler));
})

Image maui maps png

Read more in the .NET MAUI documentation about customizing controls with handlers

Modern Developer Productivity

More than being a technology that can build anything, we want .NET to also accelerate your productivity using common language features, patterns and practices, and tooling.

.NET MAUI uses the new C# 10 features introduced in .NET 6, including global using statements and file scoped namespaces – great for reducing clutter and cruft in your files. And .NET MAUI takes multi-targeting to a new level with “single project” focus.

Image code side by side png

In new .NET MAUI projects, the platforms are nestled away in a subfolder giving focus to your application where you spend the majority of your effort. Within your project’s Resources folder you have a single place to manage your app’s fonts, images, app icon, splash screen, raw assets, and styling. .NET MAUI will do the work to optimize them for each platform’s unique requirements.

solution explorer showing platform and resources folders

Multi-project vs Single project Structuring your solution with Individual projects for each platform is still supported, so you can choose when the single project approach is appropriate for your applications.

.NET MAUI uses the builder pattern made popular with Microsoft.Extensions libraries in ASP.NET and Blazor applications as a single place to initialize and configure your app. From here, you can provide .NET MAUI with your fonts, tap into platform specific lifecycle events, configure dependencies, enable specific features, enable vendor control toolkits, and more.

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureServices()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("Segoe-Ui-Bold.ttf", "SegoeUiBold");
                fonts.AddFont("Segoe-Ui-Regular.ttf", "SegoeUiRegular");
                fonts.AddFont("Segoe-Ui-Semibold.ttf", "SegoeUiSemibold");
                fonts.AddFont("Segoe-Ui-Semilight.ttf", "SegoeUiSemilight");
            });

        return builder.Build();
    }
}
public static class ServicesExtensions
{
    public static MauiAppBuilder ConfigureServices(this MauiAppBuilder builder)
    {
        builder.Services.AddMauiBlazorWebView();
        builder.Services.AddSingleton<SubscriptionsService>();
        builder.Services.AddSingleton<ShowsService>();
        builder.Services.AddSingleton<ListenLaterService>();
#if WINDOWS
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.Windows.NativeAudioService>();
#elif ANDROID
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.Android.NativeAudioService>();
#elif MACCATALYST
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.MacCatalyst.NativeAudioService>();
        builder.Services.TryAddSingleton< Platforms.MacCatalyst.ConnectivityService>();
#elif IOS
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.iOS.NativeAudioService>();
#endif

        builder.Services.TryAddTransient<WifiOptionsService>();
        builder.Services.TryAddSingleton<PlayerService>();

        builder.Services.AddScoped<ThemeInterop>();
        builder.Services.AddScoped<ClipboardInterop>();
        builder.Services.AddScoped<ListenTogetherHubClient>(_ =>
            new ListenTogetherHubClient(Config.ListenTogetherUrl));


        return builder;
    }
}

Read more in the .NET MAUI documentation about app startup with MauiProgram and single project.

Bringing Blazor to Desktop and Mobile

.NET MAUI is also great for web developers looking to get in on the action with native client apps. .NET MAUI integrates with Blazor, so you can reuse existing Blazor web UI components directly in native mobile and desktop apps. With .NET MAUI and Blazor, you can reuse your web development skills to build cross-platform native client apps, and build a single UI that spans mobile, desktop, and web.

.NET MAUI Blazor on mobile, desktop, and web

.NET MAUI executes your Blazor components natively on the device (no WebAssembly needed) and renders them to an embedded web view control. Because your Blazor components compile and execute in the .NET process, they aren’t limited to the web platform and can leverage any native platform feature, like notifications, Bluetooth, geo-location and sensors, filesystem, and so much more. You can even add native UI controls alongside your Blazor web UI. This is an all new kind of hybrid app: Blazor Hybrid!

Getting started with .NET MAUI and Blazor is easy: just use the included .NET MAUI Blazor App project template.

.NET MAUI Blazor app template

This template is all setup so you can start building a .NET MAUI Blazor app using HTML, CSS, and C#. The Blazor Hybrid tutorial for .NET MAUI will walk you through building and running your first .NET MAUI Blazor app.

Or add a BlazorWebView control to an existing .NET MAUI app wherever you want to start using Blazor components:

<BlazorWebView HostPage="wwwroot/index.html">
    <BlazorWebView.RootComponents>
        <RootComponent Selector="#app" ComponentType="{x:Type my:Counter}" />
    </BlazorWebView.RootComponents>
</BlazorWebView>

Blazor Hybrid support is also now available for WPF and Windows Forms so you can start modernizing your existing desktop apps to run on the web or to run cross platform with .NET MAUI. The BlazorWebView controls for WPF and Windows Forms are available on NuGet. Check out the Blazor Hybrid tutorials for WPF and Windows Forms to learn how to get started.

To learn more about Blazor Hybrid support for .NET MAUI, WPF, and Windows forms, check out the Blazor Hybrid docs.

Optimized for Speed

.NET MAUI is designed for performance. You have told us how critical it is for your applications to start as quickly as possible, especially on Android. The UI controls in .NET MAUI implement a thin, decoupled handler-mapper pattern over the native platform controls. This reduces the number of layers in the rendering of UI and simplifies control customization.

The layouts in .NET MAUI have been architected to use a consistent manager pattern that optimizes the measure and arrange loops to more quickly render and update your UI. We have also surfaced layouts pre-optimized for specific scenarios such as HorizontalStackLayout and VerticalStackLayout in addition to StackLayout.

From the very beginning of this journey, we set a goal to improve startup performance and maintain or reduce app size as we transitioned to .NET 6. At the time of GA, we’ve achieved a 34.9% improvement for .NET MAUI and 39.4% improvement in .NET for Android. Those gains extend to complex apps as well; the .NET Podcast sample application began with a startup of 1299ms and at GA measures 814.2ms, a 37.3% improvement since Preview 13.

The settings are enabled by default to provide a release build with these optimizations.

Image android release settings

Stay tuned for a deep-dive blog post on what we have done to achieve these results.

Get Started Today

To get started using .NET MAUI on Windows, install or update Visual Studio 2022 Preview to version 17.3 Preview 1.1. In the installer, choose the workload “.NET Multi-platform App UI development”.

dot net maui workload in visual studio installer

To use .NET MAUI on Mac, install the new Visual Studio 2022 preview for Mac (17.3 Preview 1).

Visual Studio 2022 will GA .NET MAUI tooling support later this year. On Windows today you can accelerate your dev loop with XAML and .NET Hot Reload, and powerful editors for XAML, C#, Razor, and CSS among others. Using the XAML Live Preview and Live Visual Tree, you can preview, align, inspect your UI, and edit it while debugging. .NET MAUI’s new single project experience now includes project property pages for a visual editing experience to configure your apps with multi-platform targeting.

On Mac, you can today load single project and multi-project .NET MAUI solutions to debug with a beautiful, new native Visual Studio 2022 for Mac experience. Other features for enhancing your productivity developing .NET MAUI applications will ship in subsequent previews.

We recommend getting started updating your libraries to .NET MAUI and creating new .NET MAUI projects today. Before diving headlong into converting Xamarin projects to .NET MAUI, review your dependencies, the state of Visual Studio support for .NET MAUI, and the published known issues to identify the right time to transition. Keep in mind that Xamarin will continue to be supported under the modern lifecycle policy, which states 2 years from the last major release.

Resources

We need your feedback

We’d love to hear from you! As you encounter any issues, file a report on GitHub at dotnet/maui.

Summary

With .NET MAUI, you can build native applications for Android, iOS, macOS, Tizen, and Windows from a single codebase using the same productivity patterns practiced all across .NET. The thin and decoupled UI and layout architecture of .NET MAUI together with single project features enable you to stay focused on one application instead of juggling the unique needs of multiple platforms. And with .NET 6, we’re shipping performance improvements not only for Android, but all across the breadth of platform targets.

Less platform code, more shared code, consistent standards and patterns, lightweight and performant architecture, mobile and desktop native experiences – this is just the beginning. We look forward to seeing libraries and the broader ecosystem come alongside .NET MAUI in the following months to define a new era of cross-platform application development for .NET developers that empowers you and your organization to achieve more.

135 comments

Discussion is closed. Login to edit/delete existing comments.

  • Siggi Ullrich 0

    Just great 🙂

  • Yahor Sinkevich 0

    web?

    • David OrtinauMicrosoft employee 0

      If you’re targeting web, we recommend Blazor for that, and then bringing those components to desktop and mobile with .NET MAUI and BlazorWebView.

      Today for taking a mobile or desktop UI to web, we’d recommend considering Uno.

      I’d be interested in learning more about your interest and need. Shoot me a message if you’ve like to discuss. david.ortinau@microsoft.com

      • Erick Filzek 0

        Savid we have sent an email today and posted a comment we really need your help! Please take a look and let make Maui happen and suceed !!!

      • Peter N. Moore 0

        https://github.com/dotnet/maui/discussions/62

        One of the earliest and most upvoted discussions in the repo. You guys know exactly what we all want and you know how to make it happen. As impressive as your work here has been it’s simply impossible to take any app framework seriously that doesn’t directly target web.

        • Santiago Estrada Rubio 0

          I agree. Wise words, Peter.

      • Omar Rodriguez 0

        “Today for taking a mobile or desktop UI to web, we’d recommend considering Uno”

        Uno? What is that? Please share more info

        • Peter N. Moore 0

          Are you seriously asking Microsoft to Google something for you?

          • Rand Random 0

            Are you seriously asking Microsoft to Bing something for you?
            fixed that for you 🙂

      • Peter N. Moore 0

        So Blazor, Uno, and MAUI. Your motto should be Why use one framework when you can use three for three times the cost?

        • anonymous 0

          this comment has been deleted.

        • Tim Wong 0

          Agree, don’t know why Microsoft reinvents the wheel today. The community already has some stable solutions for multi-platform development (such as “Uno platform”), so there’s no point in reinventing the wheel. Acquisition makes more sense, not only for the developer but also for resource utilization and integration.

      • Andrew Witte 0

        Unity3D is has a more portable UI than anything MS has come out with. It would almost be easier to write a portable app with that game-engine.
        The solution is a Skia like rendering layer and UI built on top.
        Blazor is a ridiculous bloatware suggestion. (how to increase app size & decrease performance for no reason)

      • Lukas 0

        I’d love to use Uno Platform for new projects! As opposed to MAUI it has the full WinUI XAML Syntax and feature set. And it is truly cross-platform, including WebAssembly and Linux as target platforms.

        But the performance is so horrible that this is a no-go for any end user app. The startup time of an empty app is a multitude of that of an empty MAUI or .NET Android app. Also the runtime performance is also bad (page switch times). I don’t know what they are doing wrong. They use Xamarin technology underneath, so theoretically, they should be able to bring similar performance. I filed an issue two years ago, but nothing really happened in the performance area.

        I’d wish Microsoft would buy Uno, and have their experts do some serious work on the performance side of things. Then this would be the definitive #1 cross-platform UI framework for me.

      • Robert O'Brien 0

        Curious about recommendation of generating ones web app story using blazor, i.e. web assembly. Why not just go the route of using one of the leading transpiler, vs framework, based native html5/ccs3/es6 single page web app development offerings like svelte?

        It would appear that .net maui’s ability to generate native android, iOS, macOS, tizen and windows apps is a preferred approach to x-platform native mobile/desktop store application development than the apache cordova effort aimed at converting single page web app implementations into native mobile/desktop store application solutions using the platform specific native app web control container host.

  • Nathan Loum 0

    Congratulations, nicely done! Is there a schedule on when the MVU coding style will be available? Are you guys still planning on making Comet the official MVU option for .NET MAUI?

    • David OrtinauMicrosoft employee 0

      Comet will be shipping a version based on .NET MAUI GA, and we will be ramping up our activity there in the coming weeks. It’ll continue as an experiment for the time being as we determine what investment we should make based on developer usage and need.

      • Ashish Khanal 0

        Thank you and Congratulations on MAUI GA release!
        All the developers I know (myself included) would love to have Comet come to .NET MAUI. 😊

      • radioActive DROID 0

        Really looking forward to comet being supported, it a real blocker for me i like c# a lot but don’t want to write my UI in XAML

        • Revi 0

          Feel exactly the same, really don’t know why they continue with XAML….Comet is a must in the modern world….

  • Jin Park 0

    I think I somehow messed up my mac m1 while removing old dotnet versions. With everything installed on todays version or even the last RC I can restore and build any other template types such as web but when I do: dotnet new maui -n “MauiProj” and do a “dotnet restore” in that directory I get a bunch of nuget errors like below. Its like nuget is only looking for linux versions. Anyone have any ideas?

    /Users/user/temp/MauiProj/MauiProj.csproj : error NU1102: Unable to find package Microsoft.NETCore.App.Host.linux-arm with version (= 6.0.5) [/Users/user/temp/MauiProj/MauiProj.sln]
    /Users/user/temp/MauiProj/MauiProj.csproj : error NU1102: – Found 84 version(s) in nuget.org [ Nearest version: 7.0.0-preview.1.22076.8 ] [/Users/user/temp/MauiProj/MauiProj.sln]
    /Users/user/temp/MauiProj/MauiProj.csproj : error NU1102: – Found 0 version(s) in /usr/local/share/dotnet/library-packs [/Users/user/temp/MauiProj/MauiProj.sln]

    • David OrtinauMicrosoft employee 0

      Try posting in the Q&A forum. I have guesses. Link back here to your forum thread if you don’t get a solution.

      • anonymous 0

        this comment has been deleted.

  • M San 0

    Teams desktop and Skype are excellent candidates for Blazor MAUI dogfooding IMO.

    • Ashish Khanal 0

      Yes, Microsoft needs to use tools that they develop.

      • Roberto Mencia Franco 1

        They should also create issues using their community portal and go through the process to see what it feels like.

        • Rolf Kristensen 0

          Priceless

  • Daniel Smith 0

    Would it be possible to support Blazor WebAssembly PWAs as a target platform in the future? You’d automatically have access to .NET with that, and it would cover all the remaining gaps (Linux & web) with a single target.

    I ask this because I’ve been playing with Blazor PWAs recently. You’ve got complete flexibility to choose any web UI framework, however I couldn’t help thinking that it would be great if there was a bunch of helper controls and layouts like MAUI has.

    If you can translate XAML to native controls on iOS and Android etc, then surely it’s feasible to translate the visuals to HTML with bit of CSS magic 🙂

    • Andrew Beeman 0

      I like this idea but I can assure you it’s fairly simple to share most of the code now. I used interfaces for my services in Blazor that called data from IndexedDB in the browser and I moved those to SQLite in Mobile / Desktop. It only took a couple weeks to have a 90% shared code base.

  • Ashish Khanal 0

    Thank you and Congratulations on MAUI GA release! This is very exciting! 😃
    Few requests/ suggestions I can think of that will make MAUI even more amazing:
    1. Please bring C# markup to MAUI.
    2. Dogfood MAUI in projects at Microsoft like Teams, Office, Visual Studio for Mac etc. This will GREATLY build developer confidence.
    3. Create great video tutorials and release them to freecodecamp YouTube channel. This will expose MAUI to lot more developers.

    Thank you!

    • Bret JohnsonMicrosoft employee 0

      On C# markup, I’m curious to know more about what exactly you’d like to see there – what syntax. Feel free to create a New Feature request here https://github.com/dotnet/maui/issues and say more, to start a discussion thread.

    • Yi Wang 0

      Do you have any idea about how huge those programs are? Rewritting them, their supporting libs and all of their tool chain is insane. Why dont you ask google to rewrite android studio using Flutter or Apple to rewrite XCode with swfit?

      This is good for mobile app level application.

  • Jarem Archer 0

    Acrylic support?

  • Emmanuel Adebiyi 0

    Congratulations to the community!

Feedback usabilla icon