2

我有一个 .NET 4.0 应用程序,它使用Microsoft.Bcl.Async来支持异步/等待,在 Windows 8 机器上的 Visual Studio 2012 下开发。它在我的机器上运行良好,在其他环境(XP/Vista/7)中运行良好。

我的构建服务器设置是 Windows Server 2008 R2、.NET 4.5 和 TeamCity。

我的构建配置无法构建我的解决方案,出现以下错误:

GenerateTemporaryTargetAssembly 
GenerateTemporaryTargetAssembly 
Ferox.Local.Wpf\uf4edrwb.tmp_proj 
CoreCompile 
Csc 
MyClass.cs(8, 29): error CS0433: The type 'System.IProgress<T>' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll' and 'c:\TeamCity\buildAgent\work\80d9f16a33820be7\packages\Microsoft.Bcl.1.0.19\lib\net40\System.Runtime.dll'

构建配置设置为 Visual Studio 2012。我检查了代理要求,它包括对“DotNetFramework4.5_x86”的依赖。因此它必须使用 .net 4.5 msbuild,如此所述。

我已经删除了这些包(Microsoft.Bcl.Async、Microsoft.Bcl、Microsoft.Bcl.Build)并再次添加了它们。没有不同。

我的选择已经不多了。有任何想法吗?

编辑

正如我所说,我刚刚设置了 TeamCity,我的构建配置非常简单。首先它从 svn 中检查出分支。

它有一个运行器类型为“Visual Studio (sln)”的构建步骤,Visual Studio 版本为 2012,“目标”字段为“清理,构建”,配置为“发布”。

此外,它使用“AssemblyInfo patcher”来更新版本号。

更新

我遵循了 Jon Skeet 的建议并将跑步者类型更改为 MSBuild。运行器类型:MSBuild MSBuild 版本:Microsoft .NET Framework 4.5 MSBuild ToolsVersion:无运行平台:x86 目标:Clean, Build 命令行参数:/P:Configuration=Release

它仍然给我同样的错误。

我已将“MSBuild ToolsVersion”更改为“4.0”(尽管我认为没有任何必要,因为该解决方案是使用 Visual Studio 2012 创建的)。同样的错误。

我已将“运行平台”更改为“x64”。同样的错误。

更新

我的服务器机器没有 .NET 4.0(和 4.0.3)的参考程序集。看了这个帖子,我觉得可能是这个原因。考虑到这一点,我已将参考程序集从我的开发人员机器复制到服务器。然后我再次尝试构建解决方案。同样的错误。我当时真的以为我会成功...

更新

我已经尝试重新启动服务器,以查看是否有任何更新挂在影响构建的 .NET4.5 安装中。同样的错误。

更新

我已经在服务器中安装了适用于 Windows 7 和 .NET 4 的 Windows SDK。它终于成功构建了!但是,我真的认为只有在 Marc Gravell 的帖子和 Hans 的回答之后复制参考程序集才能修复构建。然后我搜索了“...\Reference Assemblies\”文件夹以查看 sdk 安装是否添加了其他任何内容。然后我意识到我的错误:我已将参考程序集复制到服务器的文件夹“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework”,而不是将它们复制到“C:\Program Files (x86)\Reference程序集\Microsoft\Framework.NETFramework"。因此构建找不到程序集。

4

1 回答 1

2

存在于 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll' ...

这是一个古老的做法,它在 .NET 4.0 之前的版本中完成的方式。参考程序集存储在 Framework 目录中的位置。这不再是应该的方式,当您安装了 .NET 4.5 并尝试构建以 .NET 4.0 作为目标的程序集时,这是非常致命的。4.5 中的变化太大了,特别是对于使 async/await 工作的管道。许多其他微妙的问题,例如 ExtensionAttribute 类已从 System.Core.dll 移至 mscorlib.dll。[TypeForwardedTo] 属性隐藏的一个非常微妙的变化。但是当使用错误的参考程序集时不能。

引用程序集现在存储在其他地方,您必须引用 c:\program files\reference 程序集中的那些。对于不同的 .NET 框架版本,它具有不同的参考程序集。4.0 桌面版本位于 64 位计算机上的 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0 中。

我不清楚程序员是如何陷入这样的困境的。可能与多年前开始使用的自定义构建脚本有关。一般来说,首先要尝试的是删除所有 .NET 引用并将它们添加回来。如果这没有帮助,请仔细查看您的构建系统,/reference 编译器选项是有问题的。

于 2013-09-09T13:35:00.093 回答