MSBuild is the build engine behind .NET. Every .csproj, .vbproj and .fsproj file is an MSBuild project, and every build started from an IDE, from dotnet build or from a CI agent ultimately runs the same engine over the same XML. Most .NET developers have edited a project file without ever learning the language it is written in, which is why build problems in .NET estates tend to be diagnosed by trial and error rather than by reading.
MSBuild has four concepts and they are worth learning precisely. Properties are scalar values. Items are lists whose entries carry metadata. Targets are named, ordered units of work that can declare inputs and outputs so the engine can skip them when nothing has changed. Tasks are the executable units inside a target — Copy, Exec, Csc, MSBuild itself, or a class you wrote. On top of those sit conditions, item transforms and batching, which is the feature that lets one target run once per distinct metadata value and is simultaneously the most powerful and least understood part of the language.
A build also has two distinct phases that explain most confusing behaviour: evaluation, where the engine reads properties and items in order and imports .props and .targets files, and execution, where targets actually run. Directory.Build.props and Directory.Build.targets let you set policy for an entire repository without editing every project. The binary log — msbuild /bl — records the whole of both phases and turns build debugging from guesswork into reading a structured trace, which for most teams is the single highest-value thing in this syllabus.
Why this skill matters now
.NET estates are large, long-lived and, for the most part, undocumented at the build layer. The people who wrote the original project files have moved on, builds have accumulated targets nobody dares delete, and a full build takes fifteen minutes where it should take three. Somebody has to own that, and the skill is genuinely scarce because MSBuild is treated as an implementation detail rather than something to learn.
Migration is the other driver, and it is the reason most teams book this training. Legacy project files to SDK-style projects, packages.config to PackageReference, .NET Framework to modern .NET, and Windows-only builds to something that runs on a Linux CI agent. All four require reading and rewriting MSBuild, and doing it without a working knowledge of evaluation order, imports and conditions is how a migration turns into a quarter of unexplained build failures.
The third is cost. Build time is paid for in CI minutes and in developer waiting. Real reductions come from correct incremental targets, restoring properly, avoiding redundant project references, and understanding where time is actually going — which requires a binary log and someone who can read it. Teams that guess at build performance usually make it worse.