MSBuild 16.0
This version of MSBuild shipped with Visual Studio 2019 version 16.0.
What's new
Highlights of this release are:
MSBuildToolsVersion
is nowCurrent
. Choose the version of tools and build logic you wish to use by selecting from different MSBuild instances, rather than specifyingToolsVersion
.- MSBuild now targets .NET 4.7.2.
- MSBuild now has options to treat a build as a directed acyclic graph of projects. This is an experimental feature. Its public interface may change before it is stabilized.
Detailed release notes
Added
- Static graph features are available in an experimental form.
- Interactive mode (#3697).
CopyDocumentationFileToOutputDirectory
is now respected (#3664). Thanks @jflepp!ToolLocationHelper.GetFoldersInVSInstalls
,GetFoldersInVSInstallsAsString
andFindRootFolderWhereAllFilesExist
enable using toolsets from another Visual Studio install for C++ (#3824). Thanks, @olgaark!- Metadata may be specified as attributes in
ItemDefinitionGroup
s (#3853). Thanks, @dasMulli! - Attempting to override a property that is immutable because it was set as a global property now emits an info message (#3958, #4154).
GetFileHash
andVerifyFileHash
tasks can be used to get (non-cryptographic) hashes of file contents during the build (#3398, #3999). Thanks, @natemcmaster and @iainnicol!
Changed
- The
Copy
task now logs absolute source and destination paths (#3506). - MSBuild.exe now supports long paths on Windows (but see caveats) (#3507, #3631, #3503).
- MSBuild NuGet packages now contain SemVer2 information (#3557).
- Uncaught exceptions thrown in
ToolTask
s now log the full stack trace (#3576). - The
MSBuildAllProjects
property now automatically lists the most-recently-modified imported project first (#3605). - MSBuild attempts to log errors that resulted in a diagnostic stack dump (#3632). Thanks @danmosemsft!
- MSBuild now targets .NET 4.7.2 (#3902).
- Workflow build task binding redirects updated to 16.0 (#3737). Thanks @XinxingLiu!
$(MSBuildToolsVersion)
is nowCurrent
. Select a different ToolsVersion by changing the entry-pointMSBuild.exe
or MSBuild assembly that is invoked (#3828).BuildEventArgsReader
is now public (#3814). Thanks @daveaglick!- Help text now consistently uses
-argument
instead of/argument
form. Both continue to be supported at runtime (#3785). Thanks, @dasMulli! WriteLinesToFile
will now create the target directory if necessary (#4067). Thanks, @CodeTherapist!- Appx-related properties are now available for autocompletion (#4093).
Removed
- MSBuild packages no longer include
netcoreapp2.0
--onlynetcoreapp2.1
(#3528).
Fixed
- Replaying a binary log file is now cancellable with
ctrl-c
(#3518). - MSBuild now treats unqualified metadata references case-insensitively like other metadata references (#3516). Thanks, @MeikTranel!
ToolLocationHelper.GetPathToReferenceAssemblies
is now thread-safe (#3537). Thanks, @AntonLapounov!- MSBuild on .NET Core now finds
AssemblyFiles
(#3578). - Performance improvements in
ResolveAssemblyReferences
(#3700, #3660, #3950, #3989, #3977), glob handling (#3652), item access (#3738, #3749), path handling (#3969), and needless allocations (#4079). - Better error in .NET Core MSBuild when attempting to resolve a reference from a zero-byte file (#3708).
- Avoid a race condition in parallel multi-app-domain build requests (#3713). Thanks, @jeromelaban!
- Improved handling of MSBuild DLL loading in .NET Core (#3900). Thanks @JoeRobich!
- CoreCompile will run when
DefineConstants
has changed as a result of a property input (#3978). Thanks, @dasMulli! - Fixed a crash in the evaluation profiler when evaluation is too fast (#3981). Thanks, @xoofx!
- The
ResolveCOMReference
task now emits an error when it is run from an unsupported environment (#3987). Thanks @AaronRobinsonMSFT! - Better errors from
ToolTask
s that have bad parameters (#3970). WriteCodeFragment
can now emit positional parameters with the same value (#3974). Thanks, @dasMulli!- The Visual Basic file containing the assembly target framework attribute is now marked as generated (#4011).
GenerateResource
no longer attempts to use the Windows registry on non-Windows platforms (#3831). Thanks, @mfilippov!Copy
can now overwrite outputs when used with hardlinks (#3997). Thanks, @marcin-krystianc!- Fixed false positive when caching glob enumerations (#4007).
- Explicitly specify default SHA-1 in manifest signing (#4042). Thanks, @sidiesen!
- Case is ignored when hashing compiler inputs (#4055).
- Log the correct
SubmissionId
for evaluationBuildEventContext
s (#4048). Thanks @KirillOsenkov! - Disambiguate directories and files in existence checks (#4059).
- Improved error message for
MSB4189
(#3772). Thanks, @msschl! .csproj.user
files are no longer always modified after save (#4148).- MSBuild's VSIX depends on NuGet, eliminating errors that arose from some Visual Studio installation configurations (#4159).
RoslynCodeTaskFactory
now works on .NET Core without manually copying additional files (#3944).
Infrastructure
- MSBuild now uses Azure Pipelines for CI and PR builds.
- MSBuild is now built using arcade.
- XLF localization files are now normalized (#3568). Thanks, @dasMulli!
- Better support for having the MSBuild repo in a path with spaces (#3830). Thanks @mfilippov!
- Improved testing of the
Copy
task (#3998). Thanks, @marcin-krystianc!
Documentation
Improvements from @xsoheilalizadeh (#3559), @davidchoy98 (#3565), @isiahto (#3692), @daveaglick (#3729), and @kelewis (#3910). Thank you!