.net 4.0 使用.net 4.5在生成服务器上编译.net 4.0项目

.net 4.0 使用.net 4.5在生成服务器上编译.net 4.0项目,.net-4.0,msbuild,.net-4.5,.net 4.0,Msbuild,.net 4.5,我们有一个看似常见的错误 Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 该项目需要根据.Net 4.0进行编译,但构建在运行Windows server 2012(使用.Net 4.5)的生成服务器上。该项目是一个部

我们有一个看似常见的错误

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
该项目需要根据.Net 4.0进行编译,但构建在运行Windows server 2012(使用.Net 4.5)的生成服务器上。该项目是一个部署到运行2003的web服务器上的web应用程序,在该服务器上安装.NET4.5不是一个选项。在这里,它与“classic.NET4.0”背道而驰

从类似的问题中,我们尝试使用命令行选项来创建MSBuild:

/property:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
我们还尝试了不同的组合

/property:ReferencePath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/property:NoStdLib=true
/property:NoCompilerStandardLib=true
引用程序集(包括.dll文件)实际上安装在生成服务器上的该位置。但是,当我们部署网站并访问主页时,就会出现错误。(有趣的是,在重新加载页面时,错误消失,站点正常运行。)针对.Net 4.0程序集编译所需的MSBuild参数是什么

更新 我在MSBuild上打开了可笑的级别日志记录,我发现它显然是针对.Net 4.0引用程序集进行构建的:

Resolved file path is "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll
我没有看到在该文件夹或构建服务器的工作目录之外提到任何程序集。因此,它似乎可以正确编译,但在web服务器上部署时,它会抛出异常


至于页面重新加载时出现的异常,我想知道这是否与标记预编译步骤有关。我们正在构建服务器上运行aspnet_compile。如果生成的程序集出现异常,web服务器可能会重新编译它。重新编译的程序集很好,因为它是用true.Net 4.0创建的。

答案是令人尴尬的。在我们从详细的MSBuild输出中确认它实际上是根据正确的引用程序集构建网站项目之后,我们意识到项目中有几个内部NuGet包是根据.Net 4.5构建的。其中之一就是塞满了扩展方法,这就是导致异常的原因。根据.NET4.0重新构建它们修复了该问题


这带来了一个有趣的问题。如果第三方NuGet包是针对4.0编译的,但使用了4.5引用,我们也会遇到同样的情况,但无法修复它。因此,包发布者的教训是确保根据引用程序集编译您的4.0版本。

您使用的是ILMerge吗?我们没有使用ILMerge。请在该生成服务器上重命名C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll,然后执行干净的生成。您将找到使用错误引用程序集的项目。好主意!我们正试图弄清楚如何在Windows 2012上做到这一点。它一直在和我们作对。我们花了一点时间才弄清楚如何给它重新命名。现在我有很多NuGet错误,我正在挖掘。