How Uno Platform Works

How does Uno Platform make the same application code run on all platforms?

Uno Platform at Runtime

The Uno.WinUI NuGet package and Uno.WinRT NuGet package implement the entire WinUI and WinRT API surface across platforms. This includes:

  • Namespaces like Microsoft.UI and related UI APIs
  • The support for cross-platform non-UI APIs, such as file system access, devices and sensors, pickers, etc...
Note

As the API surface is very large, some parts are included but not implemented. These features are marked with the [Uno.NotImplementedAttribute] attribute, and a code analyzer is included with the Uno.WinUI package will generate a warning for any such features that are referenced. You can see a complete list of supported APIs here.

Rendering the UI

As a developer, you write your UI using the standard WinUI-based XAML. Under the hood, Uno Platform maps this visual tree to the appropriate rendering mechanism for each platform.

For every platform, the public API - panels, control templates, measurement and arranging, etc - is the same. However, it's sometimes useful to know what's going on at render-time, for example when embedding native views inside XAML views on a platform-specific basis.

Uno Platform provides two rendering modes, Skia and Native. The first one uses Skia to draw all the App pixels on the screen, while the second one uses the native platform APIs to render on the screen.

Skia is the default renderer in the Blank and Recommended Uno Platform project template presets.

Skia Rendering

Available on iOS, Android, macOS, Windows, Linux and WebAssembly, based on the Skia drawing library, the Skia Renderer is a cross-platform unified rendering component of Uno Platform which provides a single UI experience across all supported platforms.

The whole UI Visual Tree is drawn on an hardware accelerated canvas, using Metal, OpenGL, and WebGL where applicable. Unlike Native rendering, Skia doesn’t rely on platform UI components.

The Skia Rendering backend has a very cheap cost for creating UI elements, which makes it very efficient for large user interfaces.

For more information, see our documentation on the Skia renderer.

Native Rendering

The native rendering is our oldest rendering backend, which uses the native components and APIs to render the UI.

Each platform has its own set of platform interactions, listed below, allowing for deep integration of native components into the visual tree. Each UIElement has a corresponding native element (div on WebAssembly, UIView on iOS, ViewGroup on Android).

This renderer uses the native input controls of the platforms, providing the best access to accessibility and IME features.

For more information, see our documentation on the Native renderer.

Windows using WinAppSDK

On Windows (the net9.0-windows10.0.xxxxx target framework) using Windows App SDK, the application isn't using Uno Platform at all. It's compiled just like a single-platform WinUI application, using Microsoft's own tooling.

Uno Platform at Build Time

Binaries

Uno Platform applications use .NET 8+ and run on all major platforms:

  • Mobile/Desktop: via .NET for Mobile
  • Web: via .NET for WebAssembly
  • Linux/macOS: via standard .NET runtime

XAML Processing

  • XAML is parsed at build time using a Roslyn source generator.
  • It’s compiled to C# to improve runtime performance.
  • This is fully transparent to developers.

Assets & Resources

  • Images and other assets are transformed and copied to each platform’s expected structure.
  • String resources (.resw) are converted into platform-specific formats.
  • Learn more in Working with Assets.

Summary

Uno Platform enables a single codebase to target all major platforms by:

  • Reproducing the WinUI API surface with Uno.WinUI
  • Mapping XAML UI to native or Skia-based rendering pipelines
  • Using .NET and MSBuild to compile apps for specific targets
  • Automating asset, XAML, and resource handling for cross-platform compatibility

Whether you're building for mobile, desktop, or web, Uno Platform gives the flexibility to choose native or Skia rendering to best match the app's needs.