如果我删除auto added supportedRuntime元素会发生什么?

我有我的项目目标4.0。 我更新到4.5和VS添加

<startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup> 

除了改变TargetFrameworkVersion,我很好奇这是否是多余的。 我的理解是,如果运行时没有findsupportedRuntime,它使用.net版本用于构buildEXE。 所以在这种情况下,exe是使用4.5build立的,它也有说使用4.5。 它是否会有不同的performance,不pipe我有没有这个,只在4.0的机器上运行?

MSDN文档没有给出任何好的解释,但是我发现了Scott Hanselman的一篇博客文章,标题为“ .NET版本化和多目标 – .NET 4.5就地升级到.NET 4.0 ”,它揭示了:

如果你正在制作一个客户端应用程序,如WinForms,Console,WPF等,这是全自动的。 你的app.config包含了你需要.NET 4.5的事实,你甚至会得到一个提示来安装它。

所以configuration条目是关于如果在他们的机器上(但不是.NET 4.5)的.NET 4.0用户试图运行你的.NET 4.5应用程序会发生什么。 .NET 4.0和.NET 4.5都build立在CLR的第4版上,所以它们在理论上是兼容的; 相同的二进制格式和所有的。 一个针对.NET 4.0构build的二进制文件和一个针对.NET 4.5构build的二进制文件之间的唯一区别是它们引用的库。

所以为.NET 4.5编译的应用程序只能在安装了.NET 4.0的计算机上运行。 但是,如果您尝试使用4.0中不存在的任何API,则会得到运行时exception。

如果您有此configuration文件条目,并且.NET 4.0用户尝试运行您的应用程序,则该应用程序将不会运行,并且将提示用户安装.NET 4.5。 (请参阅Scott的博客文章中的截图。)这对大多数人来说是一个很好的默认设置。

如果您没有configuration文件条目,那么具有.NET 4.0的用户将能够运行您的应用程序,但如果您尝试调用任何方法或使用在4.5中添加的任何types,则会得到运行时exception。 这对开发人员和testing人员来说将是一个巨大的痛苦。 如果你有特定的要求 ,你的应用程序必须在.NET 4.0上运行, 并且必须利用新的4.5特性(如果它们存在的话),那么你只能这样做(而且你必须小心处理exception并在两个版本上进行广泛的testing)。

如果你希望能够在.NET 4.0上运行,但不需要任何新的4.5 API,那么你的生活就简单多了:只要进入Project Properties的Build选项卡,然后定位到.NET 4.0。 然后,编译器将确保您不会调用4.0中不存在的任何API,并且您的应用程序将在.NET 4.0和.NET 4.5机器上成功运行。