从VS11 Beta升级到VS2012 RC后,我已经从针对.NET 4.0的.NET 4.0升级到了.NET 4.5。我在app.config中注意到
部分<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
以上是什么?
当我尝试从VS2012 RC中创建一个新项目(而不是现有项目的升级)时,我在app.config中看不到上面的部分
答案 0 :(得分: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时触发的自动安装可能也不起作用。
答案 1 :(得分:9)
虽然汉斯帕斯特在他所说的一切中都是正确的,但他错过了一个关键点,即PE头在这次崩溃中的作用。
因为Dotnet 4.5是在Dotnet 4.0顶部的就地安装,并且因为它不更新Dotnet版本号,结果是使用Dotnet 4.5构建的二进制文件在其二进制文件中具有旧的Dotnet 4.0版本号PE头(4.0.30319)。
因为CLR在PE头中使用此值来确定要加载哪个版本的Dotnet Framework,并且因为针对Dotnet 4.5构建的程序集的此值不会更改,所以在没有任何其他信息的情况下CLR具有无法知道PE头中的4.0.30319程序集是否需要链接到Dotnet 4.0或4.5。
app.config中存在supportedRuntime元素,它为CLR提供了这些额外信息。因此,如果您启动一个Dotnet 4.5应用程序,并且只安装了Dotnet 4.0的系统上存在supportedRuntime条目,那么CLR将弹出一条有用的消息,通知您没有安装所需的Dotnet版本。如果您在仅安装了Dotnet 4.0的系统上启动相同的Dotnet 4.5应用程序而不 supportedRuntime条目,那么应用程序可能会开始运行,但在以后尝试使用Dotnet 4.5时会崩溃特征
虽然使用VS2012 RC构建的项目和针对Dotnet 4.5的项目可能缺少supportedRuntime条目,但使用VS2012 RTM构建的项目确实有条目。