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

升级到.NET 4.5后MSBuild部署失败,msbuild,.net-4.5,msbuild-4.0,Msbuild,.net 4.5,Msbuild 4.0,我们最近将VS 2010和.NET 4应用程序升级为VS 2012和.NET 4.5。我们有一个构建脚本来在测试服务器上部署应用程序。我们有两个框-一个是Windows 8和VS 2012(新安装),另一个是Windows 7和VS 2010和VS 2012(新安装) 从Windows 8运行构建脚本时,box构建脚本运行良好,并将应用程序部署到测试服务器。但从Windows 7 box部署应用程序时,我遇到以下错误: “C:\achith\Build\Work\Build\qa1sb.proj

我们最近将VS 2010和.NET 4应用程序升级为VS 2012和.NET 4.5。我们有一个构建脚本来在测试服务器上部署应用程序。我们有两个框-一个是Windows 8和VS 2012(新安装),另一个是Windows 7和VS 2010和VS 2012(新安装)

从Windows 8运行构建脚本时,box构建脚本运行良好,并将应用程序部署到测试服务器。但从Windows 7 box部署应用程序时,我遇到以下错误:

“C:\achith\Build\Work\Build\qa1sb.proj”(DeployAll目标)(1)->“C:\achith\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:\achith\Build\Work\App\App.csproj]C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5):错误:\r[C:\achith\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)在远程计算机上处理请求时出错。\r[C:\achith\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:\achith\Build\Work\App\App.csproj]

查看错误,MSBuild似乎使用的是VS 2010目标,而不是VS 2012,这是导致错误的原因。由于Windows 8 box没有VS 2010,因此它正确地使用了VS 2012目标


是否有人可以提供有关如何使MSBuild选择正确版本的指针?

在这种情况下,您需要指定MSBuild属性VisualStudioVersion=11.0。我刚刚在博客上写了这篇文章,为了您的方便,我也把它贴在了下面

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" />
<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)' != ''" />
在本例中,我显式地传递属性。这将始终覆盖任何其他机制以确定VisualStudioVersion的值。如果在生成脚本中使用MSBuild任务,则可以在Properties属性或AdditionalProperties属性中指定该属性。请参阅我上一篇关于属性和AdditionalProperties之间差异的博客文章

如果在生成/发布时遇到任何有趣的行为,并且注意到导入了错误的.targets文件,则可能需要指定此属性。

from

“在文本编辑器中打开*.csproj或*.vbproj web项目文件,并添加以下行

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 
True
我在这行之前加了一行

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
v4.5
而且部署时不会出错。”


它对我很有用。

我注意到,当我使用VS2012发布Web部署包功能时,它会生成一个.zip文件。在该zip文件中有一个名为archive.xml的文件,其中包含一个属性为“managedRuntimeVersion=“v4.0”的createApp标记。当我使用msdeploy.exe将其同步到iis实例时,它可以正常工作

但是,当我使用msbuild.exe创建web package.zip文件时,它包含一个archive.xml文件,该文件具有“managedRuntimeVersion=”v4.5“。尝试使用msdeploy.exe将此web包部署到IIS会导致错误\u APPPOOL\u版本\u不匹配错误


正如易卜拉欣·哈希米(Ibrahim Hashimi)在这里解释的那样,在我的msbuild.exe命令行中添加“/p:VisualStudioVersion=11.0”可以有效地强制在生成的web包的archive.xml中添加“managedRuntimeVersion=”v4.0“,从而解决问题。

对于找到此页面的任何人,搜索msdeploy/webdeploy显示类似错误的原因,我发现这就是解决办法

要解决此问题,只需将DeployManagedRuntimeVersion属性添加到VS项目中:

<targetframeworkversion>v4.5</TargetFrameworkVersion></code>
<DeployManagedRuntimeVersion>v4.0</DeployManagedRuntimeVersion>
v4.5
v4.0 从这里开始:

就我而言,构建服务器上没有安装WebDeploy。因此,它抛出了一个类似的错误。我安装了WebDeploy,我是黄金


添加“/p:VisualStudioVersion=11.0”对我不起作用。我正在使用.NET 4.0 MSBuild.exe生成我的VS2012项目,但DLL引用仍然会还原为VS2012版本(我的项目使用编码的UI测试DLL)。在.csproj文件中,我还将“VisualStudioVersion”编号从10.0更改为11.0,并再次尝试使用MSBuild生成,这个冗长的答案,虽然有丰富的信息,却丝毫没有帮助我解决这个问题。然而,阿披实在下面的回答非常有用。@KirkWoll这是因为它们是两个不同的问题。另一个答案中的信息很有用,但与此问题没有直接关系。我使用TeamCity的构建服务器上没有安装VS2012。因此,添加MSBuild属性“/p:VisualStudioVersion=10.0”对我来说很有效!!!注意:指定的是10.0版,而不是11.0版!这对我有用。非常感谢!我还尝试了/p:VisualStudioVersion=11.0,但没有成功。这对我来说很有效,但我仍然不理解这个问题。我的应用程序池(在windows azure上)和我的项目都以.net 4.5为目标。感谢您发布此。。。我使用了Sayed在两篇不同文章中针对两个不同问题的建议,并进入了一个修复循环,一个修复了另一个修复(以t为中心)
<targetframeworkversion>v4.5</TargetFrameworkVersion></code>
<DeployManagedRuntimeVersion>v4.0</DeployManagedRuntimeVersion>