Using the Uno.Sdk

Uno Platform projects use the Uno.Sdk package that is designed to keep projects simple, yet configurable. It imports the Microsoft.Net.Sdk (and the Microsoft.Net.Sdk.Web for WebAssembly).

This document explains the many features of this SDK and how to configure its behavior.

Tip

Uno.Sdk enabled projects are best experienced using the MSBuild Editor Visual Studio Extension to provide intellisense.

Managing the Uno.Sdk version

Updating the Uno.Sdk is done through the global.json file.

Uno Platform Features

As Uno Platform can be used in many different ways, in order to reduce the build time and avoid downloading many packages, the Uno.Sdk offers a way to simplify which Uno Platform features should be enabled.

You can use the UnoFeatures property in the csproj or Directory.Build.props as shown here:

<UnoFeatures>
    Material;
    Hosting;
    Toolkit;
    Logging;
    Serilog;
    MVUX;
    Configuration;
    Http;
    HttpRefit;
    HttpKiota;
    Serialization;
    Localization;
    Navigation;
    SkiaRenderer;
</UnoFeatures>
Important

Once you have changed the features list, Visual Studio requires restoring packages explicitly, or building the app once for the change to take effect.

This allows for the SDK to selectively include references to relevant sets of Nuget packages to enable features for your app.

Here are the supported features:

Feature Description
Authentication Adds the Uno.Extensions packages for Custom Authentication.
AuthenticationMsal Adds the Uno.Extensions packages for Authentication using Microsoft.Identity.Client.
AuthenticationOidc Adds the Uno.Extensions packages for Authentication using a custom Oidc client.
Configuration Adds the Uno.Extensions packages for Configuration.
CSharpMarkup Adds support for C# Markup.
Cupertino Adds support for the Cupertino Design Theme library. If the Toolkit feature is also used, it will add support for the Cupertino Design Toolkit library.
Dsp Adds support for the Uno.Dsp.Tasks packages.
Extensions Adds the most commonly used Extensions Packages for Hosting, Configuration, and Logging.
Foldable Adds a reference to Uno.WinUI.Foldable.
GLCanvas Adds support for the OpenGL Canvas.
SpellChecking Adds support for spell checking.
GooglePlay Adds support for In App Reviews. For more information, see the Store Context documentation.
Hosting Adds support for Dependency Injection using Uno.Extensions.Hosting packages.
Http Adds support for custom Http Clients with Uno.Extensions.
HttpRefit Adds support for strongly-typed REST API clients via Refit
HttpKiota Adds support for OpenAPI-generated clients via Kiota
Localization Adds support for Localization using Uno.Extensions.
Logging Adds support for Logging using Uno.Extensions.
LoggingSerilog Adds support for Serilog using Uno.Extensions.
Lottie Adds support for Lottie animations.
Material Adds support for the Material Design Theme library. If the Toolkit feature is also used, it will add support for the Material Design Toolkit library.
MauiEmbedding Adds support for embedding Maui controls in Uno Platform applications.
MediaPlayerElement Adds native references where needed to use MediaPlayerElement.
Mvvm Adds support for the CommunityToolkit.Mvvm package.
MVUX Adds support for MVUX.
Navigation Adds support for Navigation using Uno.Extensions.
Prism Adds Prism support for Uno Platform applications WinUI.
Serialization Adds support for Serialization using Uno.Extensions.
SimpleTheme Adds support for the Simple Design Theme library. If the Toolkit feature is also used, it will add support for the Simple Design Toolkit library.
Skia Adds support for SkiaSharp.
SkiaRenderer Adds support for using Skia as the graphics rendering engine. For more details, see Skia Rendering documentation.
SpellChecking Adds support for spell-checking in TextBox controls on all Skia-based targets via Uno.WinUI.SpellChecking.
Storage Adds support for Storage using Uno.Extensions.
Svg SVG support for iOS, and Android. This option is not needed when only targeting WebAssembly and WinAppSDK.
ThemeService Adds the Uno.Extensions.Core.WinUI package.
Toolkit Adds support for the Uno.Toolkit.
WebView Adds support for the WebView2 control.

Implicit Packages

Uno Platform is composed of many required and optional NuGet packages. By default, the SDK automatically references the Uno.UI required packages based on the current target framework, using versions appropriate for the version of Uno Platform being used.

It is possible to configure the version of those packages in two ways. The first is by using an explicit PackageReference to any of the Uno Platform packages, or by using the *Version properties supported by the SDK. These versions are used by the UnoFeatures defined for your app.

Here are the supported properties:

Property NuGet Package(s) Description
UnoCoreLoggingSingletonVersion Uno.Core.Extensions.Logging.Singleton Provides a logging singleton pattern with helpers and extension methods for simplified logging.
UnoCSharpMarkupVersion Uno.WinUI.Markup and similar packages Enables C# Markup, the use of C# for building UI markup, similar to XAML but with C# syntax.
UnoDspTasksVersion Uno.Dsp.Tasks and similar packages Includes tasks for Uno DSP (Theme colors import) within Uno Platform projects.
UnoExtensionsVersion Uno.Extensions.Storage.WinUI and similar packages Extends the Uno Platform with additional methods and classes for more versatile application development.
UnoLoggingVersion Uno.Extensions.Logging.OSLog and similar packages Implements logging mechanisms to help with monitoring and debugging Uno Platform applications.
UnoResizetizerVersion Uno.Resizetizer Provides tools for automatically resizing and managing image assets in Uno Platform projects.
UnoThemesVersion Uno.Material.WinUI and similar packages Supplies a variety of themes that can be applied to Uno Platform applications to enhance the UI.
UnoToolkitVersion Uno.Toolkit.WinUI and similar packages Offers a collection of controls, helpers, and tools to complement the standard WinUI components.
UnoUniversalImageLoaderVersion Uno.UniversalImageLoader Facilitates the loading and displaying of images across different platforms supported by Uno.
UnoWasmBootstrapVersion Uno.Wasm.Bootstrap and similar packages Enables the bootstrapping of Uno Platform applications running on WebAssembly.
Note

In the 5.2 version of the Uno.Sdk you must provide a value for UnoExtensionsVersion, UnoThemesVersion, UnoToolkitVersion, and UnoCSharpMarkupVersion in order to use the packages associated with the UnoFeatures from these libraries as they are downstream dependencies of the Uno repository.

Those properties can be set from Directory.Build.props or may be set in the csproj file for your project.

<!-- .csproj file -->
<Project Sdk="Uno.Sdk">
  <PropertyGroup>

      ...

      <UnoFeatures>
        Material;
        Dsp;
        Hosting;
        Toolkit;
        Logging;
        MVUX;
        Configuration;
        Http;
        Serialization;
        Localization;
        Navigation;
        ThemeService;
        Mvvm;
        SkiaRenderer;
      </UnoFeatures>
      
      <UnoToolkitVersion>6.3.6</UnoToolkitVersion>
      <MicrosoftLoggingVersion>9.0.1</MicrosoftLoggingVersion>
      <CommunityToolkitMvvmVersion>8.4.0</CommunityToolkitMvvmVersion>
  </PropertyGroup>    
</Project>

In the sample above, we are overriding the default versions of the UnoToolkit, MicrosoftLogging, and CommunityToolkitMvvm packages.

Disabling Implicit Uno Packages

If you wish to disable Implicit package usage, add the following:

<DisableImplicitUnoPackages>true</DisableImplicitUnoPackages>

to your Directory.Build.props file or csproj file. You will be then able to manually add the NuGet packages for your project.

Note

When disabling Implicit Uno Packages it is recommended that you use the $(UnoVersion) to set the version of the core Uno packages that are versioned with the SDK as the SDK requires Uno.WinUI to be the same version as the SDK to ensure proper compatibility.

For the narrower scenario of a library that is essentially a WinUI library that also happens to support Uno cross-targets — and that should not leak Uno.WinUI to WinAppSDK-only consumers, or needs a strong-named output on Windows — see the WinAppSDK-only libraries section below.

WinAppSDK-only libraries

When you author a library that is only a WinUI library on the Windows App SDK target (and uses the rest of the Uno.Sdk solely for cross-platform target frameworks), you may want the Windows build to contain no implicit Uno dependencies. Two common motivations:

  • Avoid leaking Uno.WinUI as a transitive NuGet dependency to consumers that only target the Windows App SDK.
  • Compile to a strong-named assembly on Windows for scenarios that require a fully strong-named dependency chain (organizational policy, certain hosts, or downstream consumers that only accept strong-named references). Uno.WinUI is not strong-named, so leaving it as an implicit reference would block those scenarios.

Enable this with:

<DisableImplicitUnoWinAppSdkPackages>true</DisableImplicitUnoWinAppSdkPackages>

When set, Uno.Sdk stops adding the following implicit package references on the net*-windows10* target framework:

  • Uno.WinUI (also removes the bundled Uno.UI.Toolkit.dll it ships under lib/net*-windows10.0.19041.0/)
  • Uno.Resizetizer
  • Uno.Sdk.Extras
  • Uno.Settings.DevServer

The property is intentionally scoped:

  • It only takes effect on the Windows App SDK target framework. Other targets (Android, iOS, Skia Desktop, WebAssembly, …) are unaffected, so the cross-platform side of your library still uses Uno.WinUI and the rest of the Uno stack.
  • Packages added through UnoFeatures (Toolkit, Material, Cupertino, Simple, csharpmarkup, prism, maps, foldable, skia/Graphics2DSK, glcanvas, mvvm, dsp, Uno.Extensions.*, …) are not stripped. Opting into a UnoFeatures value is treated as an explicit request for that package, even when this property is set.
  • Non-Uno implicit packages (Microsoft.WindowsAppSDK, Microsoft.Windows.SDK.BuildTools, CommunityToolkit.Mvvm, SkiaSharp.Views.WinUI, …) keep flowing as usual.

If you still need one of the stripped packages on Windows for a specific reason, add it back explicitly:

<ItemGroup Condition="$(TargetFramework.Contains('windows10'))">
    <PackageReference Include="Uno.Resizetizer" Version="$(UnoResizetizerVersion)" PrivateAssets="all" />
</ItemGroup>
Note

This property is aimed at libraries (IsPackable=true). Application heads typically need the implicit Uno packages on Windows to run, so setting this on a head project is not recommended.

Running packaged WinUI apps with dotnet run

On the Windows App SDK target, the Uno.Sdk implicitly references the Microsoft.Windows.SDK.BuildTools.WinApp package for executable (application head) projects. This package overrides the dotnet run behavior so that, instead of launching the raw executable, it registers a loose-layout package and launches the app with package identity — matching the experience of the dotnet new templates for WinUI. This means features that require package identity (such as notifications, app data, or ApplicationData) work the same way they do when the app is deployed from its MSIX package.

The package is referenced with PrivateAssets="all", so it does not flow to consumers of your project. It is only added to executable heads — libraries never pull it in.

You can control this behavior with the following properties:

Property Default Effect
EnableWinAppRunSupport true Set to false to keep the package reference but disable the dotnet run interception (the app then launches as a plain executable, without package identity).
UnoDisableWinAppRunSupport false Set to true to suppress the implicit Microsoft.Windows.SDK.BuildTools.WinApp reference entirely, so the package is never restored.
WinAppSdkBuildToolsWinAppVersion (SDK-managed) Overrides the version of the Microsoft.Windows.SDK.BuildTools.WinApp package.

For example, to turn the feature off while still restoring the package (useful if you set it conditionally), add to your csproj or Directory.Build.props:

<PropertyGroup>
  <EnableWinAppRunSupport>false</EnableWinAppRunSupport>
</PropertyGroup>

Or, to avoid restoring the package altogether:

<PropertyGroup>
  <UnoDisableWinAppRunSupport>true</UnoDisableWinAppRunSupport>
</PropertyGroup>
Note

EnableWinAppRunSupport is provided by the Microsoft.Windows.SDK.BuildTools.WinApp package itself, so it also works when you add the package explicitly. UnoDisableWinAppRunSupport is specific to the Uno.Sdk and only affects the implicit reference.

Supported OS Platform versions

By default, the Uno.Sdk specifies a set of OS Platform versions, as follows:

Target SupportedOSPlatformVersion
Android 21
iOS 14.2
macOS 10.14
tvOS 14.2
WinUI 10.0.18362.0

You can set this property in a Choose MSBuild block in order to alter its value based on the active TargetFramework.

 <Choose>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>21.0</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>14.2</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'macos'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>10.14</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tvOS'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>14.2</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$(TargetFramework.Contains('windows10'))">
      <PropertyGroup>
        <SupportedOSPlatformVersion>10.0.18362.0</SupportedOSPlatformVersion>
        <TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion>
      </PropertyGroup>
    </When>
  </Choose>

Visual Studio First-TargetFramework Workarounds

Using a Single Project in Visual Studio requires the Uno Platform tooling to apply workarounds in order to have an acceptable debugging experience.

For some of the platforms (Desktop, WinAppSDK, and WebAssembly), the corresponding target frameworks must be placed first in order for debugging and publishing to function properly. To address that problem, the Uno Platform tooling modifies the csproj file to reorder the TargetFrameworks property so that the list is accepted by Visual Studio.

As a result, the csproj file is on disk and will show the file as modified in your source control, yet the automatic change can be reverted safely. If the behavior is impacting your IDE negatively, you can disable it by adding the following in your .csproj file:

<PropertyGroup>
  <UnoDisableVSTargetFrameworksRewrite>true</UnoDisableVSTargetFrameworksRewrite>
</PropertyGroup>

Note that we are currently tracking these Visual Studio issues, make sure to upvote them:

Disabling Default Items

The Uno.Sdk will automatically includes files that you previously needed to manage within your projects. These default items include definitions for including files within the Content, Page, and PRIResource item groups. Additionally, if you have referenced the Uno.Resizetizer it will add default items for the UnoImage allowing you to more easily manage your image assets.

You may disable this behavior in one of two ways:

<PropertyGroup>
  <!-- Globally disable all default includes from the `Uno.Sdk`, `Microsoft.NET.Sdk`, and if building on WASM `Microsoft.NET.Sdk.Web` -->
  <EnableDefaultItems>false</EnableDefaultItems>

  <!-- Disable only default items provided by the `Uno.Sdk` -->
  <EnableDefaultUnoItems>false</EnableDefaultUnoItems>
</PropertyGroup>

WinAppSdk PRIResource Workaround

Many Uno projects and libraries make use of a winappsdk-workaround.targets file that corrects a bug found in WinUI. When using the Uno.Sdk these targets now are provided for you out of the box. This extra set of workaround targets can be disabled by setting the following property:

<PropertyGroup>
  <DisableWinUI8857_Workaround>true</DisableWinUI8857_Workaround>
</PropertyGroup>

Cross Targeting Support

By Default when using the Uno.Sdk you get the added benefit of default includes for an easier time building Cross Targeted Applications. The supported file extensions are as shown below:

  • *.wasm.cs (WebAssembly)
  • *.desktop.cs (Desktop)
  • *.iOS.cs (iOS)
  • *.tvOS.cs(tvOS)
  • *.UIKit.cs, *.Apple.cs (iOS & tvOS)
  • *.Android.cs (Android)
  • *.WinAppSDK.cs (Windows App SDK)

For class libraries we also provide:

  • *.reference.cs (Reference only)
  • *.crossruntime.cs (WebAssembly, Desktop, or Reference)
Note

For backwards compatibility, using .skia.cs is currently equivalent to .desktop.cs. This might change in the future, so we recommend using the suffixes above instead.

As discussed above setting EnableDefaultUnoItems to false will disable these includes.

Tip

When you need to exclude specific files from a particular target framework (such as WebAssembly), you can use a custom MSBuild target:

<Target Name="AdjustAppItemGroups" BeforeTargets="ResolveAssemblyReferences">
    <ItemGroup Condition="'$(TargetFramework)' == 'net10.0-browserwasm'">
        <None Remove="Page.xaml"/>
        <Page Remove="Page.xaml"/>
    </ItemGroup>
</Target>

This approach allows you to selectively remove pages from specific target frameworks while maintaining them in others.

Platform-Specific Folders

In addition to the per-file suffixes described above, the Uno.Sdk recognizes a set of well-known sub-folders under Platforms/ that scope their contents to a single target. Files in these folders are automatically included only when the matching TFM is being built and excluded from every other TFM (the SDK removes them from Compile, Page, Content, EmbeddedResource, and Manifest for inactive platforms).

Folder TFM it applies to Typical contents
Platforms/Android/ *-android Main.Android.cs, AndroidManifest.xml, Android resources
Platforms/iOS/ *-ios Main.iOS.cs, Info.plist, Entitlements.plist, PrivacyInfo.xcprivacy
Platforms/tvOS/ *-tvos tvOS-specific entry point and resources
Platforms/MacCatalyst/ *-maccatalyst Mac Catalyst entry point, Info.plist, Entitlements.plist
Platforms/MacOS/ *-macos macOS entry point, Info.plist, Entitlements.plist
Platforms/Desktop/ *-desktop Program.cs with the UnoPlatformHostBuilder configuration
Platforms/Wasm/ (or Platforms/WebAssembly/) *-browserwasm Program.cs, wwwroot/, manifest.webmanifest
Platforms/Windows/ *-windows10.* Package.appxmanifest, app.manifest, splash screens, tile/app-icon PNGs referenced by the manifest

The location of each folder can be overridden via the matching MSBuild property if your project uses a different layout: PlatformsProjectFolder, AndroidProjectFolder, iOSProjectFolder, tvOSProjectFolder, MacCatalystProjectFolder, MacOSProjectFolder, DesktopProjectFolder, WasmProjectFolder, WindowsProjectFolder.

Apple Privacy Manifest Support

Starting May 1st, 2024, Apple requires the inclusion of a new file, the Privacy Manifest file (named PrivacyInfo.xcprivacy), in app bundles. This file is crucial for complying with updated privacy regulations.

For projects using the Uno.Sdk (version 5.2 or later), the Platforms/iOS/PrivacyInfo.xcprivacy file is automatically integrated within the app bundle. An example of this manifest file can be found in the Uno.Templates repository.

For more information on how to include privacy entries in this file, see the Microsoft .NET documentation on the subject, as well as Apple's documentation.

Note

If your application is using the Uno Platform 5.1 or earlier, or is not using the Uno.Sdk, you can include the file using the following:

 <ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
   <BundleResource Include="iOS\PrivacyInfo.xcprivacy" LogicalName="PrivacyInfo.xcprivacy" />
 </ItemGroup>