【问题标题】:Compile .net 4.0 project on build server with .net 4.5使用 .net 4.5 在构建服务器上编译 .net 4.0 项目
【发布时间】:2013-03-04 19:29:19
【问题描述】:

我们遇到了看似常见的错误

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 创建的。

【问题讨论】:

  • 您在使用 ILMerge 吗?
  • 我们没有使用 ILMerge。
  • 在该构建服务器上重命名 C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll 并进行干净的构建。您会发现项目使用了错误的引用程序集。
  • 好主意!我们正试图弄清楚如何在 Windows 2012 上做到这一点。它一直在与我们作斗争。
  • 我们花了一点时间才弄清楚如何重命名它。现在,我正在研究很多 NuGet 错误。

标签: .net-4.0 msbuild .net-4.5


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多