Override ToolsVersion settings
You can change the Toolset for projects and solutions in one of three ways:
By using the
-ToolsVersion
switch (or-tv
, for short) when you build the project or solution from the command line.By setting the
ToolsVersion
parameter on the MSBuild task.By setting the
$(ProjectToolsVersion)
property on a project within a solution. This lets you build a project in a solution with a Toolset version that differs from that of the other projects.
Override the ToolsVersion settings of projects and solutions on command line builds
Although Visual Studio projects typically build with the ToolsVersion specified in the project file, you can use the -ToolsVersion
(or -tv
) switch on the command line to override that value and build all of the projects and their project-to-project dependencies with a different Toolset. For example:
msbuild.exe someproj.proj -tv:12.0 -p:Configuration=Debug
In this example, all projects are built using ToolsVersion 12.0. (However, see the section Order of precedence later in this topic.)
When using the -tv
switch on the command line, you can optionally use the $(ProjectToolsVersion)
property in individual projects to build them with a different ToolsVersion value than the other projects in the solution.
Override the ToolsVersion settings using the ToolsVersion parameter of the MSBuild task
The MSBuild task is the primary means for one project to build another. To enable the MSBuild task to build a project with a different ToolsVersion than the one specified in the project, it provides an optional task parameter named ToolsVersion
. The following example demonstrates how to use this parameter:
Create a file that's named projectA.proj and that contains the following code:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> <Target Name="go" > <Message Text="projectA.proj" /> <Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)" /> <Message Text="MSBuildToolsPath: $(MSBuildToolsPath)" /> <MSBuild Projects="projectB.proj" ToolsVersion="2.0" Targets="go" /> </Target> </Project>
Create another file that's named projectB.proj and that contains the following code:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> <Target Name="go"> <Message Text="projectB.proj" /> <Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)" /> <Message Text="MSBuildToolsPath: $(MSBuildToolsPath)" /> </Target> </Project>
Enter the following command at a command prompt:
msbuild projectA.proj -t:go -toolsversion:3.5
The following output appears. For
projectA
, the-toolsversion:3.5
setting on the command line overrides theToolsVersion=12.0
setting in theProject
tag.ProjectB
is called by a task inprojectA
. That task hasToolsVersion=2.0
, which overrides the otherToolsVersion
settings forprojectB
.Output: projectA.proj MSBuildToolsVersion: 3.5 MSBuildToolsPath: C:\Windows\Microsoft.NET\Framework\v3.5 projectB.proj MSBuildToolsVersion: 2.0 MSBuildToolsPath: C:\Windows\Microsoft.NET\Framework\v2.0.50727
Order of precedence
The order of precedence, from highest to lowest, used to determine the ToolsVersion
is:
The
ToolsVersion
attribute on the MSBuild task used to build the project, if any.The
-toolsversion
(or-tv
) switch that's used in the msbuild.exe command, if any.If the environment variable
MSBUILDTREATALLTOOLSVERSIONSASCURRENT
is set, then use the currentToolsVersion
.If the environment variable
MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT
is set and theToolsVersion
defined in the project file is greater than the currentToolsVersion
, use the currentToolsVersion
.If the environment variable
MSBUILDLEGACYDEFAULTTOOLSVERSION
is set, or ifToolsVersion
is not set, then the following steps are used:The
ToolsVersion
attribute of the Project element of the project file. If this attribute doesn't exist, it is assumed to be the current version.The default tools version in the MSBuild.exe.config file.
The default tools version in the registry. For more information, see Standard and custom Toolset configurations.
If the environment variable
MSBUILDLEGACYDEFAULTTOOLSVERSION
is not set, then the following steps are used:If the environment variable
MSBUILDDEFAULTTOOLSVERSION
is set to aToolsVersion
that exists, use it.If
DefaultOverrideToolsVersion
is set in MSBuild.exe.config, use it.If
DefaultOverrideToolsVersion
is set in the registry, use it.Otherwise, use the current
ToolsVersion
.