【问题标题】:Why can't MSBuild ToolsVersion 4.0 build older projects?为什么 MSBuild ToolsVersion 4.0 不能构建旧项目?
【发布时间】:2010-06-28 18:34:40
【问题描述】:

我们正在使用 Cruse Control 来管理我们的构建过程。 当我们将 vs2008 项目转换为 vs2010 时,我们将目标框架设置为 3.5,用于 Web 和类库项目。

在这一点上,我们不会将所有解决方案都转换为 vs2010;如果我们不必这样做,则不会。

我最近更新了巡航控制使用的 MSbuild 项目文件指向 MSBuild 4.0,以便我们的构建过程能够构建 vs2010 项目。

C:\windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

在提交针对 4.0 框架的 Web 项目之前,一切都很好。 此时弹出此错误:

CS0433:“System.Web.Routing.RouteCollection”类型存在于两者中 c:\Windows\Microsoft.NET\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a \System.Web.dll 和 c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Web.Routing.dll in Global.asax.cs(15, 43)

此时我意识到Windows/Microsoft.NET/Assembly 文件夹。

现在...所有 MSBuild 项目,即使它们使用的是 MSBuild 4.0,仍然将工具版本设置为 3.5。 那么为什么 3.5 目标构建查看新的 4.0 程序集文件夹并发现此冲突?可能是因为我使用的是 MSBuild 4.0。但是,如果我可以更改 MSBuild 使用的 toolVersion,您会认为我可以告诉它以 3.5 为目标,而不必担心这些潜在的冲突。

为解决此问题,我访问了巡航控制使用的相关 MSBuild 项目文件,并将其 toolsVersion 更改为 4.0。这通过了冲突错误。但是现在每次它尝试在我们尚未转换为 vs2010 项目的解决方案中构建一个项目时,它都会出现如下错误:

SomeFilePath 中的 MyProject.csproj: LC0000:'无法加载文件或程序集或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。在 LC(0, 0)

如果我在 Visual Studio 2010 中打开包含该项目的解决方案并进行转换,构建它并提交它并强制另一个构建,我通过该错误只是发现另一个尚未转换的项目正在抛出相同的错误.

所以现在我确定使用 MSBuild 4.0 并真正针对 4.0 框架。为什么 4.0 不能构建 3.5 项目或 vs2008 解决方案项目?

【问题讨论】:

  • 不知道该怎么办。我是否需要将我们所有的解决方案都转换为 vs2010 .NET 4.0...?
  • Microsoft 于 2010 年 1 月 13 日上午 8:39 发布您遇到的错误(“此程序集由比当前加载的运行时更新的运行时构建,无法加载”)表明您正在使用 MSBuild 3.5 构建项目。即使您的目标是 3.5 框架,您也应该使用 MSBuild 4.0,因为如错误所示,TFS 构建任务具有 4.0 框架依赖项。 MSBuild 4.0 的多目标功能将确保您的项目仍然是针对适当的框架构建的。

标签: msbuild frameworks build build-process msbuild-4.0


【解决方案1】:

问题是您已将部分项目迁移到 Visual Studio 2010。任何引用 2010 项目(按项目引用)的 2008 项目都会给您此编译时错误。尝试将所有 .csproj 文件更新到 2010 并再次尝试重建。

【讨论】: