47

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

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

\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 选择正确版本的指示吗?

4

5 回答 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 中打开此项目时,对您的项目文件进行了一些更改,以确保它可以在 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 以上。在某些情况下,从命令行构建需要显式设置此属性。在我们到达那里之前,让我解释一下这个属性是如何设置的(按这个顺序)

  1. 如果 VisualStudioVersion 被定义为环境变量/全局 MSBuild 属性,则使用该属性。
    • 这是 VS 和 VS 开发人员命令提示符设置此值的方式
  2. 基于 .sln 文件的文件格式版本(使用的工具集是 sln 文件格式 –1)
    • 为了简化此语句,.sln 文件将通过将 VisualStudioVersion 指定为创建 .sln 文件的 VS 版本的值来构建。
  3. 选择默认
    • 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 文件,那么您可能需要指定此属性。

于 2012-08-19T21:11:58.077 回答
41

这个链接

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

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion> 

我在该行之前添加了该行

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

它的部署没有错误。”

它对我有用。

于 2012-10-24T00:44:07.853 回答
2

对于找到此页面以搜索为什么 msdeploy/webdeploy 显示类似错误的任何人,我发现这是解决方案。

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

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

从这里: http ://techblog.dorogin.com/2013/11/deploying-45-projects-with-webdeploy.html

于 2014-10-22T01:00:11.010 回答
2

我观察到,当我使用 VS2012 Publish Web Deploy Package 功能时,它会生成一个 .zip 文件。在该 zip 中有一个名为 archive.xml 的文件,其中包含一个带有属性 'managedRuntimeVersion="v4.0"' 的 createApp 标记。当我使用 msdeploy.exe 将其同步到 iis 实例时,它可以工作。

但是,当我使用 msbuild.exe 创建 Web 包 .zip 文件时,它包含一个具有“managedRuntimeVersion="v4.5"' 的 archive.xml。尝试使用 msdeploy.exe 将此 Web 包部署到 IIS 会导致 ERROR_APPPOOL_VERSION_MISMATCH 错误。

正如 Sayed Ibrahim Hashimi 在这里解释的那样,在我的 msbuild.exe 命令行中添加“/p:VisualStudioVersion=11.0”可以有效地在生成的 Web 包的 archive.xml 中强制使用“managedRuntimeVersion="v4.0"”,从而解决了问题。

于 2013-10-25T20:07:27.023 回答
0

在我的情况下,WebDeploy 没有安装在构建服务器上。所以它抛出了类似的错误。我安装了 WebDeploy,我很成功。

http://www.microsoft.com/en-ca/download/confirmation.aspx?id=25230

于 2015-08-24T21:06:37.023 回答