在这种情况下,您需要指定 MSBuild 属性 VisualStudioVersion=11.0。我刚刚在http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx上写了一篇博客,为了您的方便,我也将它粘贴在下面。
Visual Studio 2012 最受欢迎的功能之一是能够在 VS 2012 和 VS 2010 中打开项目(需要 VS 2010 SP1)。如果您还没有听说我们确实实现了该功能。您可能想知道我们是如何做到这一点的,以及这会如何影响您。
如果您为在 VS2010 中创建的 Web 项目打开 .csproj/.vbproj,您将看到以下导入语句。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\
v10.0\WebApplications\Microsoft.WebApplication.targets" />
当您在 VS 2012 中打开此项目时,对您的项目文件进行了一些更改,以确保它可以在 VS 2010 SP1 和 VS 2012 中打开。第一次在 VS 2012 中加载项目时对项目所做的更改之一是添加以下内容以替换该导入语句。
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
我们删除了硬编码的 10.0,而是使用属性 VisualStudioVersion。在 Visual Studio 2012 中构建时,此值将始终为 11.0,但对于 VS 2010,它不存在。这就是为什么我们将其默认为 10.0 以上。在某些情况下,从命令行构建需要显式设置此属性。在我们到达那里之前,让我解释一下这个属性是如何设置的(按这个顺序)
- 如果 VisualStudioVersion 被定义为环境变量/全局 MSBuild 属性,则使用该属性。
- 这是 VS 和 VS 开发人员命令提示符设置此值的方式
- 基于 .sln 文件的文件格式版本(使用的工具集是 sln 文件格式 –1)
- 为了简化此语句,.sln 文件将通过将 VisualStudioVersion 指定为创建 .sln 文件的 VS 版本的值来构建。
- 选择默认
- 10.0 如果安装了 VS 2010
- 安装了最高版本的子工具集版本
对于#2,当您构建 .sln 文件时,VisualStudioVersion 的值将是 .sln 文件中找到的格式版本的 –1。这里要注意的重要一点是,如果您构建一个 .sln 文件,它将使用与创建 .sln 文件的 VS 版本相对应的 VisualStudioVersion 值来构建。因此,如果您在 VS2012 中创建 .sln 文件并且始终构建该 .sln 文件,则 VisualStudioVersion 的值将为 11.0。在许多情况下,如果您构建 .sln 文件,您就很好。
如果您正在构建 .csproj/.vbproj 文件而不通过 .sln 文件?如果您从命令行(不是开发人员提示符)构建 Web 项目,则使用的 VisualStudioVersion 的值为 10.0。那是我上面展示的属性的产物。在这种情况下,您应该将其作为 MSBuild 属性传入。例如
msbuild.exe MyAwesomeWeb.csproj /p:VisualStudioVersion=11.0
在这种情况下,我明确地传递了属性。这将始终覆盖任何其他机制以确定 VisualStudioVersion 的值。如果您在构建脚本中使用 MSBuild 任务,则可以在 Properties 属性或 AdditionalProperties 属性中指定属性。有关 Properties 和 AdditionalProperties 之间的区别,请参阅我之前的博客文章。
如果您在构建/发布时遇到任何有趣的行为,并且您注意到正在导入错误的 .targets 文件,那么您可能需要指定此属性。