Publish an unpackaged .NET MAUI app for Windows with the CLI

When distributing your .NET Multi-platform App UI (.NET MAUI) app for Windows, you can publish the app and its dependencies to a folder for deployment to another system.

Configure the project build settings

Add the following <PropertyGroup> node to your project file. This property group is only processed when the target framework is Windows and the configuration is set to Release. This config section runs whenever a build or publish in Release mode.

<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows' and '$(RuntimeIdentifierOverride)' != ''">
    <RuntimeIdentifier>$(RuntimeIdentifierOverride)</RuntimeIdentifier>
</PropertyGroup>

The <PropertyGroup> in the example is required to work around a bug in the Windows App SDK. For more information about the bug, see WindowsAppSDK Issue #3337.

Publish

To publish your app, open the Developer Command Prompt for VS 2022 terminal and navigate to the folder for your .NET MAUI app project. Run the dotnet publish command, providing the following parameters:

Parameter Value
-f The target framework, which is net8.0-windows{version}. This value is a Windows TFM, such as net8.0-windows10.0.19041.0. Ensure that this value is identical to the value in the <TargetFrameworks> node in your .csproj file.
-c The build configuration, which is Release.
-p:RuntimeIdentifierOverride=win10-x64
- or -
-p:RuntimeIdentifierOverride=win10-x86
Avoids the bug detailed in WindowsAppSDK Issue #3337. Choose the -x64 or -x86 version of the parameter based on your target platform.
-p:WindowsPackageType The package type, which is None for unpackaged apps.
-p:WindowsAppSDKSelfContained The deployment mode for your app, which can be framework-dependent or self-contained. This value should be true for self-contained apps. For more information about framework-dependent apps and self-contained apps, see Windows App SDK deployment overview.

Warning

Attempting to publish a .NET MAUI solution will result in the dotnet publish command attempting to publish each project in the solution individually, which can cause issues when you've added other project types to your solution. Therefore, the dotnet publish command should be scoped to your .NET MAUI app project.

For example:

dotnet publish -f net8.0-windows10.0.19041.0 -c Release -p:RuntimeIdentifierOverride=win10-x64 -p:WindowsPackageType=None

Note

In .NET 8, the dotnet publish command defaults to the Release configuration. Therefore, the build configuration can be omitted from the command line.

Publishing builds the app, copying the executable to the bin\Release\net8.0-windows10.0.19041.0\win10-x64\publish folder. In this folder, there's an exe file, and that's the built app. This app can be launched or the entire folder can be copied to another machine and launched there.

An important distinction from a packaged app is that this won't include the .NET runtime in the folder. This means that the app will require the .NET runtime to first be installed on the machines that will eventually run the app. To ensure the app also contains all the runtime components, the -p:WindowsAppSDKSelfContained argument can be provided when publishing. For example:

dotnet publish -f net8.0-windows10.0.19041.0 -c Release -p:RuntimeIdentifierOverride=win10-x64 -p:WindowsPackageType=None -p:WindowsAppSDKSelfContained=true

For more information about the dotnet publish command, see dotnet publish.