ToolsVersion 和 TargetFrameworkVersion 有什么区别?
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
......
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
答案 0 :(得分:9)
区别在于TargetFrameworkVersion
实际上有任何影响,而ToolsVersion
通常完全忽略 由您的工具链使用VS2013中的任何VS.
丹尼尔简明扼要地说:
目标框架是.net框架功能/类 可以在您的代码中使用。
至于ToolsVersion
(在项目文件的Project
元素内):
除非您指定MSBUILDLEGACYDEFAULTTOOLSVERSION
,否则会被忽略:请注意var名称中的“legacy”。
这实际上是在MSDN文档中证明的,但你必须在版本之间来回跳转,并且像Compiling for ToolsVersion 12 with Visual Studio 2015这样的背景事实也会有所帮助。
以下是相关的MSDN部分:(所有emph.mine)
MSBuild Toolset (ToolsVersion)
当在项目文件中定义的ToolsVersion值时,MSBuild会使用 该值以确定Toolset属性的值 可用于该项目。一个Toolset属性是$(MSBuildToolsPath), 它指定.NET Framework工具的路径。只有这样
是必需的工具集属性(或$(MSBuildBinPath))
...这实际上是错误的,并且将VS2015文档与VS2012文档进行比较,我们发现段落被复制了。
但是,VS2015文档继续第二段,VS2012 version中缺少该段落
从Visual Studio 2013开始,MSBuild Toolset版本就是 与Visual Studio版本号相同。 MSBuild默认为此 Visual Studio和命令行中的工具集,无论如何 项目文件中指定的工具集版本。此行为可以 使用/ ToolsVersion标志覆盖。有关更多信息,请参阅 Overriding ToolsVersion Settings
按照链接,我们看到:
覆盖ToolsVersion设置
...
优先顺序
优先顺序,从最高到最低,用于确定 ToolsVersion是:
- 用于构建项目的MSBuild任务上的ToolsVersion属性(如果有)。
- msbuild.exe命令中使用的/ toolsversion(或/ tv)开关,如果有的话。
- 如果设置了环境变量MSBUILDTREATALLTOOLSVERSIONSASCURRENT,则使用当前的ToolsVersion。
如果设置了环境变量MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT并且项目文件中定义的ToolsVersion更大 比当前的ToolsVersion,使用当前的ToolsVersion。
如果设置了环境变量
MSBUILDLEGACYDEFAULTTOOLSVERSION
,或者未设置ToolsVersion,则使用以下步骤:
- 项目文件的Project元素的 ToolsVersion属性。如果此属性不存在,则假定为 当前版本。
- MSBuild.exe.config文件中的默认工具版本。
- 注册表中的默认工具版本。有关更多信息,请参阅标准和自定义工具集配置。
- 醇>
如果未设置环境变量MSBUILDLEGACYDEFAULTTOOLSVERSION,则使用以下步骤:
- 如果环境变量MSBUILDDEFAULTTOOLSVERSION设置为存在的ToolsVersion,请使用它。
- 如果在MSBuild.exe.config中设置了DefaultOverrideToolsVersion,请使用它。
- 如果在注册表中设置了DefaultOverrideToolsVersion,请使用它。
- 否则,请使用当前的ToolsVersion。
请注意,项目文件仅用于突出显示的情况。
答案 1 :(得分:6)
工具版本是要使用的MSBuild版本。目标框架可以在您的代码中使用.net框架功能/类。