一个.net 4.5.2的应用程序怎么能在只安装了4.5.1的构建服务器上编译呢?



这让我完全困惑了。我正在测试将我们的构建基础架构升级到。net 4.5.2,它目前在。net 4.5.1上。

我的第一步是创建一个ASP。.NET MVC项目在我的开发机器针对。NET 4.5.2。我正在使用VS 2013,并安装了4.5.2开发人员包。我利用。net 4.5.2中只支持的方法编写了一些多余的代码:
public ActionResult Index()
{
    if (!Response.HeadersWritten)
        Response.AddOnSendingHeaders((c) => { c.Response.AddHeader("Foo", "Bar"); });
    return View();
}

Response.HeadersWrittenResponse.AddOnSendingHeaders仅在System.Web.dll的。net 4.5.2版本中引入。如预期的那样,这在本地可以很好地编译。

在将构建服务器升级到4.5.2之前,我想我只是在构建服务器上从源代码控制运行上述项目的构建,看看它失败了。但是,构建成功完成,只报告以下警告:

.NETFramework,Version=v4.5.2没有找到。要解决这个问题,安装SDK或目标包此框架版本或将应用程序重新定位到的版本为其安装SDK或目标包的框架。请注意,程序集将从全局程序集缓存解析(GAC),并将用于代替参考程序集。因此您的程序集可能没有正确地针对您使用的框架意愿。

我把编译好的二进制文件从拖放到我的本地机器上,应用程序运行良好,并添加了foo头文件。

这个4.5.2代码是如何编译的!没有对System的本地引用。Web签入正在构建的源代码,并且没有任何东西通过nuget包或其他方式拉入。

我已经追踪到在构建期间引用的GAC中System.Web.dll的版本。尽管所有的文档都指出Response.HeadersWrittenResponse.AddOnSendingHeaders只在。net 4.5.2中引入,但以下。net 4.5/4.5.1的安全更新将一个版本的System.Web.dll安装到GAC中,其中确实包含了这些方法:

https://support.microsoft.com/en-us/kb/2894854

这解释了为什么编译仍然成功。当使用/p:TargetFrameworkVersion=v4.5.1 msbuild开关强制编译以4.5.1为目标的构建时,System.Web.dll引用是从以下位置提取的旧版本,它不包括这些方法,因此无法按预期编译:

C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5.1System.Web.dll

如果你的应用程序没有使用v4.5.2特有的任何东西(或过时或以破坏性的方式更改),你应该很好。

    .NET Framework中的应用程序兼容性4.5.2
  • .NET Framework 4.5.2的新特性

当然,也可能是B^),您只是没有遇到特定的执行路径,导致事情出错。

此外,人们可能会注意到4.5.2是对4的就地更新。x族,所以你得到的dll是一样的。

最新更新