MSBuild Versions and Release History

This section documents MSBuild 18.9, the .NET SDK 10.0.402 (with its dotnet CLI) and NuGet 7.9, as published in the MSBuild, .NET and NuGet documentation on learn.microsoft.com, which is the reference these pages are written and verified against. Material about .NET 11 / NuGet 8.0 is still in preview and is always flagged as such — never presented as baseline.

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.

MSBuild has its own version number, separate from Visual Studio and from the .NET SDK, and each Visual Studio release and each SDK feature band carries a specific MSBuild. Knowing which one runs explains most "works in Visual Studio, fails in CI" differences. This page shows how to find the version, maps it to Visual Studio and the SDK, and collects the release history cited throughout this section. The baseline is MSBuild 18.9.15 in .NET SDK 10.0.402.

Finding the version in use

dotnet --version
dotnet msbuild -version
dotnet msbuild cw.proj -getProperty:MSBuildVersion -getProperty:MSBuildRuntimeType -getProperty:MSBuildAssemblyVersion
10.0.402
18.9.15.50611
{
  "Properties": {
    "MSBuildVersion": "18.9.15",
    "MSBuildRuntimeType": "Core",
    "MSBuildAssemblyVersion": "18.0"
  }
}
  • dotnet --version is the SDK chosen for the current folder (after global.json); dotnet msbuild -version is the MSBuild inside that SDK. With 10.0.402 the two are 10.0.402 and 18.9.15.

  • msbuild -version in a Visual Studio Developer Command Prompt prints the msbuild.exe version (18.11 with Visual Studio 2026 18.11) — a different MSBuild from the one dotnet build runs on the same machine.

  • $(MSBuildVersion) is the version inside a project; $(MSBuildRuntimeType) is Core for dotnet and Full for msbuild.exe. The assemblies themselves keep assembly version 15.1.0.0 for every release from 15 to 18 (The MSBuild API and MSBuild Locator).

Version mapping

The .NET SDK version’s hundreds digit is its feature band (10.0.1xx, 10.0.2xx, …); each band ships a newer MSBuild.

MSBuild Visual Studio .NET SDK Notes

15.x

2017

.NET Core 1.x—​2.x

SDK-style projects

16.x

2019

.NET Core 3.x, .NET 5

17.0

2022 17.0

.NET 6 (6.0.1xx)

64-bit msbuild.exe

17.8

2022 17.8

.NET 8 (8.0.1xx)

Terminal Logger opt-in

17.12

2022 17.12

.NET 9 (9.0.1xx)

Terminal Logger default, BuildCheck

18.0

2026 18.0

.NET 10 (10.0.1xx)

.NET task host

18.9

 — 

10.0.4xx (10.0.402)

this section’s baseline

18.11

2026 18.11

 — 

latest stable (GitHub tag v18.11.0)

18.12 (preview)

 — 

.NET 11 RC 2

preview

The release tags on GitHub jump from v18.0.2 to v18.3.3: there are no 18.1 or 18.2 tags. The tags were listed with git ls-remote --tags https://github.com/dotnet/msbuild on 2026-10-23.

Release history

The MSBuild documentation has no "what’s new" page after 17.0. Later rows cite the .NET SDK what’s-new pages and the GitHub releases; rows marked re-verify were not checked against a release note.

Release Change Cited from

15.0 (Visual Studio 2017)

SDK-style projects and the Sdk attribute; Directory.Build.props/.targets (re-verify)

SDK-Style Project Files

15.8

RoslynCodeTaskFactory, cross-platform inline tasks (re-verify)

Inline Tasks

16.x (Visual Studio 2019)

static graph builds (-graph, -isolate); -interactive — the exact 16.x minor is not documented (re-verify)

Parallel, Graph and Server Builds

17.0 (Visual Studio 2022)

64-bit msbuild.exe in Visual Studio; -warnNotAsError; binary-log changes; breaking changes listed on the page

17.0: 64-bit, logs, breaking changes

17.8 (.NET 8)

Terminal Logger opt-in (-tl); -getProperty, -getItem, -getTargetResult

.NET 8 SDK

17.12 (.NET 9)

Terminal Logger on by default for dotnet build, clean, msbuild, pack, publish, restore and test; BuildCheck (-check, experimental)

.NET 9 SDK: Terminal Logger, BuildChecks

17.13 (9.0.2xx)

a .slnx is picked up when no project is named (the SDK band is inferred; re-verify)

MSB1011

18.0 (Visual Studio 2026, .NET 10)

the .NET task host: tasks built for .NET run in msbuild.exe and Visual Studio (Runtime="NET")

.NET 10 SDK

18.6

-mt / -multiThreaded and IMultiThreadableTask (in-process multithreaded builds)

Update tasks for multithreaded mode

18.9 (SDK 10.0.4xx)

this section’s baseline; change wave 18.9 (Mark-of-the-Web ResX blocking, MSB3821)

Change waves

.NET 11 (preview)

MSBuild Server on by default (DOTNET_CLI_USE_MSBUILD_SERVER=false or MSBUILDUSESERVER=0 to opt out); change waves 17.10, 17.12, 17.14 and 18.3 removed in the release that accompanies .NET 11

.NET 11 SDK, Change waves

Guarding logic by version

Shared .props/.targets files that must run on several MSBuild versions test $(MSBuildVersion) with the version functions, never with string or < comparisons (Conditions):

<Project>
  <Target Name="Show">
    <Message Importance="high" Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(MSBuildVersion)', '18.6'))"
             Text="MSBuild $(MSBuildVersion): -mt is available" />
    <Message Importance="high" Condition="'$(MSBuildRuntimeType)' == 'Full'"
             Text="Running in msbuild.exe (.NET Framework)" />
  </Target>
</Project>
  MSBuild 18.9.15: -mt is available

A package that needs a minimum MSBuild can also fail early with an Error task under the opposite condition, which is clearer than the error the missing feature would cause.

Common mistakes

  • Assuming Visual Studio and dotnet build use the same MSBuild — 18.11 versus 18.9 on a machine with Visual Studio 2026 18.11 and SDK 10.0.402.

  • Comparing $(MSBuildVersion) with < — use VersionGreaterThanOrEquals.

  • Reading the assembly version (15.1.0.0) as the product version.

  • Looking for a "what’s new in MSBuild 18" page — use the GitHub releases and the SDK what’s-new pages.