Workloads
|
This section documents MSBuild 18.9, the .NET SDK 10.0.402 (with its This content was generated with the assistance of AI and should be verified against the official documentation before being relied on in production. The C# Reference bibliography lists the reference material consulted while preparing these pages. |
A workload is an optional part of the .NET SDK installed on demand: the toolchains and runtime packs for mobile and
desktop platforms (android, ios, maui, macos), WebAssembly (wasm-tools) and WASI (wasi-experimental).
Workloads keep the SDK download small while letting it build for platforms most developers never target. .NET Aspire was
a workload in .NET 8 and became ordinary NuGet packages and an SDK in .NET 9. This page manages workloads with
.NET SDK 10.0.402 on Linux x64, where the platform-specific iOS and Mac Catalyst workloads are not offered.
Finding and installing
dotnet workload search
dotnet workload install wasi-experimental
dotnet workload list
Workload ID Description
--------------------------------------------------------------------------------
android .NET SDK Workload for building Android applications.
macos .NET SDK Workload for building macOS applications.
maui-android .NET MAUI SDK for Android
maui-tizen .NET MAUI SDK for Tizen
maui-windows .NET MAUI SDK for Windows
wasi-experimental .NET WASI experimental tooing for net10.0
wasm-experimental .NET WebAssembly experimental tooling for net10.0
wasm-tools .NET WebAssembly build tools for net10.0
wasm-tools-net9 .NET WebAssembly build tools for net9.0
…
Installing pack Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.wasi-wasm version 10.0.13...
Writing workload pack installation record for Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.wasi-wasm version 10.0.13...
Installing pack Microsoft.NET.Runtime.WebAssembly.Wasi.Sdk version 10.0.13...
…
Garbage collecting for SDK feature band(s) 9.0.300 10.0.400...
Successfully installed workload(s) wasi-experimental.
Workload version: 10.0.402.1
Installed Workload Id Manifest Version Installation Source
---------------------------------------------------------------------
wasi-experimental 10.0.113/10.0.100 SDK 10.0.400
A workload is a set of packs — runtime packs, cross-compilers, templates — installed into the dotnet folder
(packs/, sdk-manifests/), so installing one into a system-wide .NET needs administrator rights. Workloads are tied
to an SDK feature band (10.0.400 above): installing a new band, such as 10.0.500, means installing its workloads
again. The "Garbage collecting" step removes packs that no installed band uses.
IDs with a framework suffix (wasm-tools-net9) are the same tooling for older target frameworks.
When a project needs a workload
A project that targets a platform framework without its workload fails at evaluation, with the fix in the message:
<TargetFramework>net10.0-android</TargetFramework>
~/.dotnet/sdk/10.0.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.ImportWorkloads.targets(38,5): error NETSDK1147: To build this project, the following workloads must be installed: android [~/wl/W.csproj]
~/.dotnet/sdk/10.0.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.ImportWorkloads.targets(38,5): error NETSDK1147: To install these workloads, run the following command: dotnet workload restore [~/wl/W.csproj]
dotnet workload restore reads the projects in the current folder (or the one given) and installs every workload they
need — the command for CI and new machines.
Source: dotnet workload restore, NETSDK1147.
Maintenance commands
| Command | Purpose |
|---|---|
|
Update installed workloads (to the newest workload set, or newest manifests; see below). |
|
Reinstall missing or damaged packs of installed workloads. |
|
Remove a workload. |
|
Remove packs left behind by uninstalled SDKs or failed operations ( |
|
List install/update operations and the workload version after each (.NET 9). |
|
Show or set |
dotnet workload history
dotnet workload repair
dotnet workload uninstall wasi-experimental
Id Date Command Workloads Global.json Version Workload Version
-------------------------------------------------------------------------------------------------------------------------------------
1 01/01/0001 00:00:00 +00:00 InitialState 10.0.400-manifests.da132f47
2 10/23/2026 19:28:33 +00:00 install wasi-experimental 10.0.402.1
Successfully repaired workloads: wasi-experimental
Successfully uninstalled workload(s): wasi-experimental
The history shows the effect of the first install: before it, the SDK used the workload manifests it shipped with
(10.0.400-manifests.da132f47); the install moved the installation to the newest workload set, 10.0.402.1.
Workload sets
A workload set is a version number (10.0.402.1) for a group of workload manifests that were released and tested
together. In workload-set update mode — the mode this SDK 10.0.402 installation reported — install, update and restore move all workloads
to one set at once; in the older manifests mode each workload’s manifest updates independently, which is how two
developers ended up with different MAUI versions from the same command.
dotnet workload config --update-mode
dotnet workload search version
workload-set
10.0.402.1
10.0.402
10.0.401.1
10.0.401
10.0.400.1
A repository pins its set in global.json, next to the SDK version, so that dotnet workload restore installs the
same set everywhere:
{
"sdk": {
"version": "10.0.402",
"workloadVersion": "10.0.400"
}
}
10.0.400 (not installed)
Workload version 10.0.400, which was specified in ~/wl3/global.json, was not found. Run "dotnet workload restore" to install this workload version.
(dotnet workload --version and dotnet workload list in that folder.) With a workloadVersion in global.json,
the commands use workload-set mode and that set regardless of config; --version on install/update is ignored
inside the folder. Advertising manifests — notices of newer manifests that dotnet workload update downloads in
the background — tell the CLI when an update is available.
Common mistakes
-
Installing workloads by hand on build agents — run
dotnet workload restorein the repository instead. -
Upgrading the SDK band and expecting workloads to follow — each band needs its own install.
-
Mixing update modes across a team — pin
workloadVersioninglobal.json. -
Running workload commands without rights to the
dotnetfolder — a system-wide installation needssudoor an elevated prompt.