【问题标题】:Can a build server with .NET 4.5 installed successfully deploy a project targeting 4.0 to a server with only .NET 4.0 installed?安装了 .NET 4.5 的构建服务器能否成功地将针对 4.0 的项目部署到仅安装了 .NET 4.0 的服务器?
【发布时间】:2013-01-28 07:44:37
【问题描述】:

我们最近在我们的持续集成构建服务器上安装了 .NET 4.5,以便它可以支持利用 .NET 4.5 功能的新项目。此构建服务器还用于构建和部署较旧的项目,其中一些针对 .NET 4.0。

在此服务器上构建以 .NET 4.0 为目标的项目,然后部署到仅安装了 .NET 4.0 的目标服务器现在失败并出现以下错误:

Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.

Environment.CurrentManagedThreadId 是 .NET Framework 4.5 的新属性,因此运行 4.0 的服务器找不到它是有道理的。但是,我们在构建时以 .NET 4.0 为目标,因此理论上我们不应该需要在生产服务器上安装 4.5。

总结一下:

  • 项目目标 4.0
  • 构建服务器已安装 4.5
  • 随后部署项目的服务器只有 .NET 4.0
  • 项目在运行时失败并出现错误Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.

什么给了?当 .NET 4.5 的服务器构建 dll 时,是否可以在仅安装 .NET 4.0 的服务器上成功运行 .NET 4.0 dll?

【问题讨论】:

    标签: .net .net-4.0 .net-4.5 .net-framework-version


    【解决方案1】:

    出现这种情况是因为 4.5 是对 4.0 的就地升级。当构建服务器编译时,默认情况下,即使您的目标是 .NET 4,它也会找到 4.5 程序集。

    您可以更正此问题,但您需要将 4.0 引用程序集添加到构建服务器(以便编译器找到它们),而不仅仅是依赖 .NET 4.5 版本。

    详情请见Marc Gravell's blog post on the subject

    【讨论】:

    • 谢谢,那篇博文似乎描述了我们遇到的确切问题。但是,据我们所知,构建服务器确实已经拥有 4.0 参考程序集,所以我们仍然不确定出了什么问题。
    • @DavidMills 一般来说,如果你打算以 4.0 为目标,我实际上强烈建议不要在构建服务器上安装 4.5。在这个就地升级中有太多的重大变化。话虽如此,如果 ref 程序集位于正确的位置,它应该可以工作。
    • 谢谢,里德。我们已经着手设置了一个 Jenkins 构建从属服务器来支持针对 4.0 的项目。这很不幸,但似乎是必要的。希望微软在发布另一个 .NET 版本作为就地升级之前三思而后行。
    • “希望微软在发布另一个 .NET 版本作为就地升级之前三思而后行”...您好 .NET 4.5.1!
    • 您的回答引起了一些unnecessary angst,您可能需要注释一下。
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多