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 中看不到上述部分

4

2 回答 2

13

这是永恒的 .NET 版本控制泥潭的副作用。.NET 4.5 不是 .NET 框架的并行版本,它完全取代了 .NET 4.0 安装。很像 3.0 和 3.5 取代了 .NET 2.0 安装。

3.0 和 3.5 的更新相当温和,框架刚刚获得了一堆新的程序集。CLR 和核心基类程序集没有改变。很多。

4.5 版本框架附带的 clr.dll 文件仍然有 4.0.30319 版本号。CLR 4.0 版本的版本号相同。并且可以轻松执行以 .NET 4.0 框架为目标的 .NET 应用程序。

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

于 2012-07-29T16:20:32.267 回答
9

尽管 Hans Passant 所说的一切都是正确的,但他忽略了一个关键点,那就是 PE 头在这场崩溃中的作用。

因为 Dotnet 4.5 是在 Dotnet 4.0 之上的就地安装,并且因为它不更新 Dotnet 版本号,所以结果是使用 Dotnet 4.5 构建的二进制文件在其二进制文件的 PE 标头中具有旧的 Dotnet 4.0 版本号 ( 4.0.30319)。

因为 CLR 在 PE 标头中使用此值来确定要加载哪个版本的 Dotnet 框架,并且因为对于针对 Dotnet 4.5 构建的程序集,此值不会更改,因此在没有任何附加信息的情况下,CLR 无法知道 PE 标头中包含 4.0.30319 的程序集是否需要链接到 Dotnet 4.0 或 4.5。

正是 app.config 中的 supportedRuntime 元素向 CLR 提供了这些额外信息。因此,如果您在仅安装了 Dotnet 4.0 的系统上启动了带有 supportedRuntime 条目的 Dotnet 4.5 应用程序,则 CLR 将弹出一条有用的消息,通知您没有安装所需的 Dotnet 版本。然而,如果您在仅安装了 Dotnet 4.0 的系统上启动相同的 Dotnet 4.5 应用程序而没有supportedRuntime 条目,则该应用程序可能会开始运行,但在稍后尝试使用 Dotnet 4.5 功能时会崩溃。

虽然使用 VS2012 RC 构建并以 Dotnet 4.5 为目标的项目可能缺少 supportedRuntime 条目,但使用 VS2012 RTM 构建的项目确实具有该条目。

于 2013-10-23T21:17:03.743 回答