🕓 13 MINWelcome to our …
For our first release of 2025, we’re doubling down on what matters most to you—productivity, performance, and seamless cross-platform development experiences. There are major advancements across the board, from faster Hot Reload and expanded app packaging support to significant runtime and memory optimizations.
Read on to dive into all the new capabilities, fixes, and optimizations we’ve packed into this release – over 170 new PRs were included in 5.6!
We are obsessed with Hot Reload performance and stability. Simply put, our goal is to match or surpass Flutter’ Hot Design experience. To achieve this, we build on everything Microsoft provides in .NET and Visual Studio, while adding our own features and optimizations. Hot Reload is an obsession for us for a reason—it’s the foundation of Hot Design, our next-generation Visual Designer that transforms running apps into design canvases.
In this release, following numerous updates from the .NET and Visual Studio teams, we’ve significantly improved the Hot Reload experience for mobile platforms (iOS, Android, Catalyst). We now offer full XAML and C# Hot Reload support for these targets across all IDEs. Additionally, Hot Reload with the debugger has been added for in Visual Studio for Windows for iOS and Android targets.
Under the hood, we’ve leveraged a new C# compiler feature that expands the support for lambda modifications, reducing the likelihood of rude edits that would otherwise force an app restart or code rollback. We’ve also started to leverage the recent support for metadata update handlers for mobile platforms on Visual Studio, providing the full XAML language support for Hot Reload. These improvements significantly improve Hot Reload stability.
These latest improvements build on the continuous Hot Reload enhancements we’ve introduced in nearly every Uno Platform release—including real-time notifications, expanded IDE support to Rider and Code, and greater stability for complex UIs. If you haven’t tried Uno Platform’s Hot Reload yet, now is the perfect time!
Traditionally, app packaging has been one of the most dreaded tasks for developers, regardless of the tech stack. In our 5.5 release, we introduced streamlined packaging for Windows (ClickOnce), Linux (Snap), and macOS (.app), making it easier to generate executables and store-ready packages.
This time, we’re expanding this further with support for generating desktop macOS .pkg and .dmg files, including code signing and notarization for publishing on the App Store. Using this new support, with a few changes in your project and command line, you’ll be able to package your app without the many complex steps that are usually required.
Additionally, we’ve added support for destructive mode Snap package creation, ideal for CI environments where LXD and Multipass virtualization are restricted.
In our 5.6 release, we’ve made significant improvements across multiple areas of the Uno Platform, focusing on performance, efficiency, and memory optimization. For example, just in one scenario, a key fix in Wasm AOT compilation resolves a slowdown issue, delivering up to 10x faster execution. Additionally, Visual State creation is now more efficient, reducing animation processing on Wasm by 2.5x.
Depending on how you use Uno Platform, you may not benefit from every performance tweak we’ve made. However, based on our test sample applications, we are seeing a 2.5x performance improvement in common scenarios. For instance, the DataGrid sample implementation, part of our Uno Gallery, now loads around three times faster when compared to Uno 5.5.
Try it at gallery.platform.uno
We are committed to delivering a faster, leaner, and more optimized Uno Platform experience. Want to know what changed under the hood? Read on for the specifics of Wasm AOT, Visual State, Resource Dictionary, Layout, Memory, and Resource Files Trimming updates.
Upgrading to the latest Uno Platform? Our migration guide walks you through breaking changes and updates, so you can keep your codebase running smoothly.
During our pursuit for performance improvements, we identified an issue in the AOT compiler that caused some methods to not be AOT compiled, causing a 10x slowdown by falling back to the interpreter.
A very specific case caused this issue, appearing when both a “catch” and “finally” were found in the same method, but not necessarily on the same “try”. This could cause methods to fall back to the interpreter and run significantly slower.
We’re introducing workarounds in 5.6 for Uno code paths that mitigate this issue for .NET 9, until fix in the runtime is made available in .NET 9. This fix is already available in our latest .NET 8 bootstrapper.
Visual States created from XAML are now less expensive, and on WebAssembly, Uno is doing less interop.
We refactored the interactions with JavaScript to avoid transitioning too much from/to managed code, and this has a significant impact on the time taken to apply animation frame changes. In the sample below, we can see the profiled time spent going by 2x:
We’ve ported the “Key not found” cache strategy found in WinUI for resource resolution scenarios, to avoid performing already known deep searches in nested dictionaries. This change speeds up the creation time of UI controls.
In detail, Static and Theme resources are resolved recursively from a view through all their parents, until the application resources are met. For all these intermediate dictionaries, which allow for overriding individual resources on controls (using Lightweight theming), lookups need to be performed on each control and their resources, merged resources and theme resources. Including a “not found cache” for those dictionaries reduces the number of searches significantly.
This specific optimization has a great impact on very large trees of repeated controls, which all need to resolve (or fail to do so at the control level) the same resource keys, such as DataGrid.
We’ve fixed issues where in some circumstances, collapsed controls would still be incorrectly materialized, slowing down the overall creation of the UI controls. This is significant as many controls use optional features that only materialize parts of their own templates based on the Visibility property (e.g. the clear button of a TextBox).
All controls expose their own ResourceDictionary instances, yet most controls have their instance empty. In 5.6, those instances are lazily created, saving about 400 bytes per control which does not have resources. In a typical app, this is a very large proportion of the UI elements.
Building on top of the Uno XAML trimming and string trimming features used for WebAssembly, we’re now including automatic resource file trimming. Over time, Uno has grown and with it the supported controls and their many translation files, increasing the final package size.
With 5.6, the build is now automatically trimming resource files for controls that are not used by an app. For an empty uno app, this brings the size down of the largest Uno assembly by 16%.
There are many other updates available in this release, among which you can find:
You can check out the full changelog on GitHub.
Tags: XAML, WPF, Xamarin, UWP, Silverlight, .NET, Windows, C#, XAML
Uno Platform
360 rue Saint-Jacques, suite G101,
Montréal, Québec, Canada
H2Y 1P5
USA/CANADA toll free: +1-877-237-0471
International: +1-514-312-6958
Uno Platform 5.2 LIVE Webinar – Today at 3 PM EST – Watch