升级到.NET 4.5后,MSBuild部署失败

47
我们最近将我们的VS 2010和.NET 4应用程序升级到了VS 2012和.NET 4.5。我们有一个构建脚本来在测试服务器上部署该应用程序。我们有两个盒子 - 一个是装有VS 2012(全新安装)的Windows 8,另一个是装有VS 2010和VS 2012(新安装)的Windows 7。
当从Windows 8盒子运行构建脚本时,构建脚本可以很好地工作并将应用程序部署到测试服务器上。但是当从Windows 7盒子部署应用程序时,会出现以下错误:
"C:\ Achinth \ Build \ Work \ build \ qa1sb.proj"(DeployAll目标)(1) - >“C:\ Achinth \ Build \ Work \ App \ App.csproj”(ResolveReferences; MsDeployPublish目标)(2)-> (MSDeployPublish目标)-> C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(3847,5):错误:Web部署任务失败。((2012年8月19日下午6:23:41)在远程计算机上处理请求时发生错误。)[C:\ Achinth \ Build \ Work \ App \ App.csproj] C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(3847,5):错误:\ r [C:\ Achinth \ Build \ Work \ App \ App.csproj] C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(3847,5):错误:(2012年8月19日下午6:23:41)在远程计算机上处理请求时发生错误。[C:\ Achinth \ Build \ Work \ App \ App.csproj] C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(3847,5):错误:您尝试使用的应用程序池具有“managedRuntimeVersion”属性设置为“v4.0”。这个应用程序需要“v4.5”。[C:\ Achinth \ Build \ Work \ App \ App.csproj]

从错误信息看,MSBuild使用的是VS 2010目标而不是VS 2012,这导致了错误。由于Windows 8系统没有安装VS 2010,因此它正确地使用了VS 2012目标。

请问有人能提供如何让MSBuild选择正确版本的指针吗?

5个回答

57
在这种情况下,您需要指定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中打开这个项目时,会对项目文件进行几处更改,以确保它可以在VS2010 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的原因。
有一些情况下,在命令行中进行构建需要显式设置此属性。在此之前,让我解释一下如何设置此属性(按照以下顺序):
1. 如果VisualStudioVersion被定义为环境变量/全局MSBuild属性,则将使用它。
- 这是VS和VS Developer命令提示符设置此值的方式。
2. 基于.sln文件的文件格式版本(使用的工具集是sln文件格式-1)
- 简单来说,.sln文件将使用指定VisualStudioVersion的值来构建由创建.sln文件的VS版本。
3. 选择默认值
- 如果安装了VS2010,则为10.0 - 安装的最高版本子工具集版本。
对于#2,当您构建.sln文件时,VisualStudioVersion的值将为.sln文件中找到的格式版本的-1。重要的是要注意,如果构建.sln文件,则它将使用与创建.sln文件的VS版本相对应的VisualStudioVersion的值进行构建。因此,如果您在VS2012中创建.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文件,则可能需要指定此属性。


2
添加“/p:VisualStudioVersion=11.0”对我没有起作用。我正在使用.NET 4.0的MSBuild.exe来构建我的VS2012项目,但是DLL引用仍然会恢复到VS2012版本(我的项目使用了Coded UI测试DLL)。 - Ciaran Gallagher
1
在.csproj文件中,我还将“VisualStudioVersion”号码从10.0更改为11.0,并尝试使用MSBuild进行构建,但DLL仍然回退到版本10的DLL。 - Ciaran Gallagher
2
这个长回答虽然提供了大量信息,但对我解决问题没有丝毫帮助。下面Abhishikt的答案非常有用。 - Kirk Woll
@KirkWoll 这是因为它们是两个不同的问题。另一个答案中的信息很有用,但并不直接涉及到这个问题。 - Sayed Ibrahim Hashimi
2
我的构建服务器使用TeamCity,但没有安装VS2012。因此,添加MSBuild属性"/p:VisualStudioVersion=10.0"对我很有用!注意:指定的是版本10.0,而不是11.0! - JTech
请注意,VS2015仍然使用 Microsoft Visual Studio Solution File, Format Version 12.00,因此您将面临相同的问题 - 在这种情况下,您需要使用 /p:VisualStudioVersion=14.0 - White hawk

41

源自此链接

在文本编辑器中打开您的*.csproj或*.vbproj Web项目文件,然后添加以下行。

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 

在该行代码前面,我添加了这行代码:

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

而且它部署没有错误。

对我来说有效。


1
这对我有用。非常感谢!我也尝试了/p:VisualStudioVersion=11.0,但没有起作用。 - juhan_h
4
虽然我仍然不理解问题,但这对我起了作用。我的应用程序池(在Windows Azure上)和我的项目都针对.NET 4.5。 - xtrem
谢谢您发布这个...我使用了Sayed在两个不同的帖子中提出的建议来解决两个不同的问题,并陷入了一个循环,其中一个修复程序撤销了另一个修复程序(围绕visualstudioversion 10或11)。这解决了我的问题! - richman64
谢谢,这是我尝试的第9个方法,也是第一个成功完成任务的。 - Paul Smith
它可以工作!它可以工作!我不明白为什么,但至少现在我可以继续处理下一个部署故障了。 - Ryan Lundy

2

如果有人通过搜索找到了这个页面,想了解为什么msdeploy/webdeploy会显示类似的错误信息,我找到了解决方法。

只需在您的VS项目中添加DeployManagedRuntimeVersion属性即可解决问题:

<targetframeworkversion>v4.5</TargetFrameworkVersion></code>
<DeployManagedRuntimeVersion>v4.0</DeployManagedRuntimeVersion>

从这里开始:http://techblog.dorogin.com/2013/11/deploying-45-projects-with-webdeploy.html 该文章介绍了如何使用WebDeploy部署45个项目。WebDeploy是一种用于将应用程序发布到IIS服务器的工具。通过使用WebDeploy,您可以轻松地将多个项目一次性部署到服务器上。
在本文中,作者提供了详细的步骤和代码示例,以帮助读者理解如何使用WebDeploy进行批量部署。此外,还讨论了一些常见问题,并提供了解决方案。
如果您需要批量部署多个项目,那么WebDeploy是一个非常有用的工具。阅读本文,了解如何使用WebDeploy来简化您的部署过程。

2
我发现使用VS2012发布Web Deploy包功能时,它会生成一个.zip文件。在该zip文件中有一个名为archive.xml的文件,其中包含一个createApp标签,其属性为'managedRuntimeVersion="v4.0"'. 当我使用msdeploy.exe将其同步到IIS实例时,它可以正常工作。
然而,当我使用msbuild.exe创建Web Package .zip文件时,它包含一个具有'managedRuntimeVersion="v4.5"'的archive.xml。尝试使用msdeploy.exe将此Web Package部署到IIS时,会导致ERROR_APPPOOL_VERSION_MISMATCH错误。
正如Sayed Ibrahim Hashimi在这里解释的那样,将“/p:VisualStudioVersion=11.0”添加到我的msbuild.exe命令行中,可以有效地强制在生成的Web Package的archive.xml中使用“managedRuntimeVersion =“v4.0””,从而解决了这个问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接