使用Microsoft.Bcl.Async的.NET 4.0应用程序无法在.NET 4.5构建服务器上构建

时间:2013-09-06 19:37:16

标签: .net-4.0 msbuild teamcity .net-4.5 base-class-library

我有一个.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,如here所述。

我已删除软件包(Microsoft.Bcl.Async,Microsoft.Bcl,Microsoft.Bcl.Build)并再次添加它们。没有区别。

我的选项已经用完了。有什么想法吗?

修改

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

它有一个构建步骤,运行者类型为“Visual Studio(sln)”,Visual Studio版本为2012,“Targets”字段为“Clean,Build”,配置为“Release”。

此外,它使用“AssemblyInfo修补程序”来更新版本号。

更新

我遵循了Jon Skeet的建议并更改了跑步者类型做MSBuild。 亚军类型:MSBuild MSBuild版本:Microsoft .NET Framework 4.5 MSBuild ToolsVersion:无 运行plataform:x86 目标:清洁,构建 命令行参数:/ P:Configuration = Release

它仍然给我同样的错误。

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

我已将“Run plataform”更改为“x64”。同样的错误。

更新

我的服务器机器没有.NET 4.0(和4.0.3)的引用程序集。在看到this post之后,我认为这可能是原因。考虑到这一点,我已将参考程序集从我的开发人员计算机复制到服务器。然后我尝试再次构建解决方案。同样的错误。我真的以为我已经成功了......

更新

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

更新

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

1 个答案:

答案 0 :(得分:2)

  

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

这是一种古老的做法,就像在4.0之前的.NET版本中完成的那样。其中引用程序集存放在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编译器选项是有问题的那个。