在只安装了4.5.1的构建服务器上,.NET 4.5.2应用程序如何仍能编译?

在只安装了4.5.1的构建服务器上,.NET 4.5.2应用程序如何仍能编译?,.net,asp.net-mvc,tfsbuild,.net-4.5.2,.net,Asp.net Mvc,Tfsbuild,.net 4.5.2,这让我完全困惑不解。我正在测试将构建基础架构升级到.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.AddO

这让我完全困惑不解。我正在测试将构建基础架构升级到.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();
}
和仅在.NET 4.5.2版的
System.Web.dll
中引入。正如所料,这在本地编译得很好

在将构建服务器升级到4.5.2之前,我认为我应该从源代码管理在构建服务器上运行上述项目的构建,以防失败。但是,生成成功完成,仅报告以下警告:

framework.NETFramework的参考程序集,版本=v4.5.2” 未找到。若要解决此问题,请为安装SDK或目标软件包 此框架版本或将应用程序重定向到的版本 为其安装SDK或目标包的框架。 请注意,程序集将从全局程序集缓存中解析 (GAC)并将用于替代参考组件。所以 您的程序集可能没有正确地针对您的框架 打算

我将编译好的二进制文件从下拉列表中拉到本地机器上,应用程序运行正常,并添加
foo
标题


这4.5.2代码是如何编译的!没有对System.Web的本地引用已签入正在构建的源代码,也没有任何内容通过nuget软件包或诸如此类的方式被引入。

如果您的应用程序没有使用v4.5.2特定的内容(或被废弃或以破坏性的方式更改),您应该是优秀的

当然,也可能是B^)您还没有遇到具体的执行路径


此外,您可能会注意到,无论您运行的是哪一个4.x版本,您都会得到相同的dll。

我已经跟踪到GAC中的
System.Web.dll
版本,该版本在构建过程中被引用。尽管所有文档都指出,
Response.headerswrited
Response.AddOnSendingHeaders
仅在.NET 4.5.2中引入,但以下针对.NET 4.5/4.5.1的安全更新在GAC中安装了System.Web.dll版本,其中包括这些方法:

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


C:\Program Files(x86)\Reference Assembly\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.dll

是否在配置中指定4.5.2必须是框架目标?如果是的话,放松这一限制。如果不是,我不明白你为什么会出现这个错误。我使用的是上面提到的两种方法,它们只存在于4.5.2中。如果我使用
/p:TargetFrameworkVersion=v4.5.1
msbuild开关强制编译目标为4.5.1的版本,那么该版本将无法按照预期编译。我只是不明白,如果4.5.2没有安装在构建服务器上,并且没有找到4.5.2引用程序集的警告出现,为什么在没有开关的情况下构建成功。这是因为4.5.2是一个就地更新,所以4.5.2替换了任何更改的4.5.1 dll(例如System.Web.dll)。有关详细信息,请参阅和。