.net-4.0 - 使用 .net 4.5 在构建服务器上编译 .net 4.0 项目

标签 .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)的构建服务器上的项目中。该项目是一个 Web 应用程序,它被部署到运行 2003 的 Web 服务器,其中安装 .Net 4.5 不是一个选项。在那里它与“经典”.Net 4.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 服务器将重新编译它。重新编译的程序集很好,因为它是用真正的 .Net 4.0 创建的。

最佳答案

好吧,结果证明答案令人尴尬。在我们从详细的 MSBuild 输出确认它实际上是针对正确的引用程序集构建网站项目后,我们意识到项目中有几个内部 NuGet 包是针对 .Net 4.5 构建的。其中之一是充满了扩展方法,这就是导致异常的原因。针对 .Net 4.0 重建它们解决了这个问题。

这就引出了一个有趣的问题。如果第 3 方 NuGet 包针对 4.0 编译但使用 4.5 引用,我们将处于相同的情况,但无法修复它。因此,包发布者的教训是确保您的 4.0 版本是针对引用程序集编译的。

关于.net-4.0 - 使用 .net 4.5 在构建服务器上编译 .net 4.0 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15209507/

相关文章:

wcf - .net 4.0 中是否包含 WebProtocolException?

visual-studio-2013 - 在 TFS 构建期间未找到程序集

c# - 在 SignalR 2.0 OnReceived 处理程序中调用 await 的正确方法

c# - 未发送 HttpClient 身份验证 header

c# - 带有来自多个表的条件的 EF 查询

c# - .Net4 中的 GC : Specifying gcServer and gcConcurrent together

visual-studio-2010 - MSBuild 找不到异步所需的引用

c# - 如何在调用 window.showdialog 后以编程方式关闭窗口?

entity-framework - 为动态数据网站添加自定义过滤器(VS2010、EF4)

visual-studio - VS2019 - msbuild 不被识别为内部或外部命令