雖然Hans Passant在他所說的所有內容中都是正確的,但是他忽略了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.5應用程序而不是僅安裝了Dotnet 4.0的系統上的supportedRuntime條目,則應用程序可能會開始運行,但之後嘗試使用Dotnet 4.5功能時會崩潰。
雖然使用VS2012 RC構建的項目和針對Dotnet 4.5的項目可能缺少supportedRuntime條目,但使用VS2012 RTM構建的項目確實有條目。
所以當用戶有.NET 4.0時,它會顯示錯誤,說.NET 4.5是該配置所必需的。如果該配置不在那裏呢?既然我已經瞄準了.NET 4.5,那麼它不會拋出錯誤嗎? – friend 2012-07-30 13:09:57
是的,但很難解釋。像MissingMethodException或FileNotFoundException,不是一個友好的消息,如「你沒有.NET 4.5,你想我爲你安裝嗎?」看到http://stackoverflow.com/a/10033128/17034 – 2012-07-30 13:15:32
@nobugz,我一直有點困惑,我需要與我的應用程序一起提供哪個版本的.NET。基於你上面的評論,我是否明白只有.NET 4.5 **的應用程序必須使.NET 4.5可用?換句話說,如果.NET 3.5,3.0等在系統上,我不必擔心。 – 2012-10-24 02:40:02