在只安装了4.5.1的构建服务器上,.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中支持的方法编写了一些多余的代码:在只安装了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
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特定的内容(或被废弃或以破坏性的方式更改),您应该是优秀的
此外,您可能会注意到,无论您运行的是哪一个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)。有关详细信息,请参阅和。