升级VS11 Beta到VS2012 RC后,在app.config中支持v4.0运行时

14

从VS11 Beta升级到VS2012 RC后,我已经将目标从.NET 4.0修改为.NET 4.5。 我注意到在 app.config 中有以下部分:

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

上面的内容是用来做什么的?

当我尝试从VS2012 RC中创建一个新项目(而不是升级现有项目)时,在app.config中我看不到上面的那一部分。

2个回答

13

这是永恒的.NET版本棘手问题的副作用。 .NET 4.5不是.NET框架的并存版本,而是完全替换.NET 4.0安装。就像3.0和3.5替换了.NET 2.0安装一样。

3.0和3.5更新相当温和,框架只是获得了一堆新程序集。CLR和核心基类程序集没有改变。在很大程度上来说。

随着框架一起提供的clr.dll文件仍然具有4.0.30319版本号。与CLR的4.0版本相同的版本号。并且可以轻松执行针对.NET 4.0框架目标的.NET应用程序。

然而,该框架版本在内部进行了大量修改。它获得了语言投影,使您可以使用托管语言编写在Windows 8上运行的Metro应用程序。重大更改包括将类从一个程序集移动到另一个程序集,允许在手机或平板电脑上部署的应用程序规模适中。app.exe.config文件添加到您的项目上确保您的用户拥有所需的版本。部署.config文件是可选的,但当用户仅安装了.NET 4.0时,用户将看到一个相当不透明的异常消息。实际上不确定会是什么样子。当他没有安装4.5时触发的自动安装可能也无法起作用。


当用户使用.NET 4.0时,它会显示错误,指出需要.NET 4.5。如果没有那个配置文件怎么办?既然我已经针对.NET 4.5,那么不会抛出错误吗? - friend
是的,但这种错误信息更难以解释。像MissingMethodException或FileNotFoundException这样的错误信息,而不是像“您没有.NET 4.5,是否要我为您安装它?”这样友好的提示。请参见https://dev59.com/72kw5IYBdhLWcg3wPYIP#10033128。 - Hans Passant
1
@nobugz,我一直有点困惑需要在我的应用程序旁边提供哪个版本的.NET。根据您上面的评论,我是否可以理解为仅针对.NET 4.5的应用程序只需提供.NET 4.5?换句话说,我不必担心系统上是否有.NET 3.5、3.0等版本? - Matt Davis
您将收到一个配置错误,其中包含以下消息:Web.config文件中<compilation>元素中的'targetFramework'属性仅用于针对.NET Framework 4.0及更高版本(例如'<compilation targetFramework="4.0"> ')。'targetFramework'属性当前引用的是晚于已安装的.NET Framework版本的版本。请指定有效的.NET Framework目标版本,或安装所需版本的.NET Framework。 - Leniel Maccaferri

9
虽然Hans Passant所说的一切都是正确的,但他忽略了PE头在这场灾难中的作用。
由于Dotnet 4.5是覆盖在Dotnet 4.0之上的安装程序,并且它不会更新Dotnet版本号,因此使用Dotnet 4.5构建的二进制文件在其二进制的PE头(4.0.30319)中具有旧的Dotnet 4.0版本号。
由于CLR在PE头中使用此值来确定要加载哪个版本的Dotnet Framework,并且因为针对Dotnet 4.5构建的程序集的此值不会更改,如果没有任何其他信息,则CLR无法知道具有PE头中4.0.30319的程序集是否需要链接到Dotnet 4.0还是4.5。
正是app.config中的supportedRuntime元素提供了这种额外的信息给CLR。因此,如果您在安装了仅有Dotnet 4.0的系统上运行带有支持的runtime条目的Dotnet 4.5应用程序,则CLR将弹出一个有用的消息,告诉您未安装所需版本的Dotnet。而如果您在仅安装了Dotnet 4.0的系统上运行相同的Dotnet 4.5应用程序没有supportedRuntime条目,则该应用程序可能会启动运行,但在稍后尝试使用Dotnet 4.5功能时崩溃。
虽然使用VS2012 RC构建并针对Dotnet 4.5进行目标设置的项目可能会缺少supportedRuntime条目,但使用VS2012 RTM构建的项目确实具有该条目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接