Overriding ToolsVersion Settings
You can select the Toolset for a project file by using the /ToolsVersion switch (or /tv, for short) or by setting the $(ProjectToolsVersion) property. This lets you build a project in a solution with a Toolset version that differs from that of the other projects. You can also override the tool version used by an MSBuild task by setting the ToolsVersion task parameter.
Override the ToolsVersion Settings of Projects 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:4.0 /p:Configuration=Debug
In this example, all projects are built using ToolsVersion 4.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="4.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="4.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 the ToolsVersion=4.0 setting in the Project tag.
ProjectB is called by a task in projectA. That task has ToolsVersion=2.0, which overrides the other ToolsVersion settings for projectB.
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 used by a project to build 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.
The ToolsVersion attribute of the Project element of the project file.
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.
Numbers 1, 2, and 3 are the same as properties:
Properties attribute on the MSBuild task
/p: switch on msbuild.exe
Property tag in the project file