我们的一个ASP.NET MVC 5 Web应用程序具有以下web.config设置:
<system.web>
<compilation debug="true" targetFramework="4.6" />
<httpRuntime targetFramework="4.5" />
<!--... many other things -->
</system.web>
目前尚不清楚为什么有两个targetFramework设置,编译目标4.6然后尝试在4.5下运行似乎是错误的...
显然我错过了什么,但是什么?
答案 0 :(得分:41)
targetFramework
中存在web.config
的原因是为了在每个.NET Framework版本的更改之间保持兼容性问题。 targetFramework
compilation
和httpRuntime
之间的差异属于每个开发和部署环境。
根据MSDN blog:
<compilation targetFramework="4.6" />
选择.NET Framework的参考程序集的版本 执行编译时使用。 (注意:Visual Studio需要这样做 这个元素存在于Web.config中,即使我们自动推断它。)
此元素确定编译期间使用的程序集版本,以便从当前项目创建依赖项和相关程序集。
<httpRuntime targetFramework="4.5" />
表示当前项目旨在使用.NET 4.5运行时程序集,而无需在部署机器中重新编译现有项目程序集,然后再将其加载到内存中。
因此,我们可以得出targetFramework
元素httpRuntime
上定义的版本号,用于在运行时使用中保持编译项目和可用程序集之间的兼容性,具体取决于目标中使用的运行时文件版本机。
因此,在您的情况下,这不是一个错误的行为,项目创建者只是希望保持运行时兼容性与具有类似特征(即版本4.5)的目标机器中可用的最低运行时版本,甚至是编译的项目较新版本的.NET程序集。版本4.5和4.6之间的差异相对较小,因此在此上下文中仍然可以将运行时版本降低到4.5。
相关参考资料:
https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/dn833125(v=vs.110).aspx
答案 1 :(得分:5)
根据我的理解,<compilation debug="true" targetFramework="4.6" />
被<httpRuntime targetFramework="4.5" />
抑制,因为httpRuntime
被翻译为以下
<compilation targetFramework="4.5" />
<machineKey compatibilityMode="Framework45" />
<pages controlRenderingCompatibilityVersion="4.5" />
所以上面的设置可能是由于一些误解或一个错误,如果由VS直接完成,我不相信是真的。
要了解此设置和所有其他相关内容的含义,这个由Microsoft员工撰写的标题为All about <httpRuntime targetFramework>的博客可能会对您有所帮助。但它的要点是;
.NET Framework(包括ASP.NET)努力维持接近100% 在计算机上更新现有框架时的兼容性。我们 尽可能确保如果开发了一个应用程序 并针对.NET Framework 4进行部署,它将继续工作 在4.5。这通常意味着保持古怪,错误或不受欢迎 版本之间的产品行为,因为修复它们可能 对依赖这些行为的应用程序产生负面影响。