2012-07-29 15 views
14

從VS11 Beta升級到VS2012 RC之後 - 我已經從將.NET 4.0定位到.NET 4.5進行了修改。我注意到在app.config以下部分將VS11 Beta升級到VS2012後,在app.config中支持運行時v4.0 RC

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

以上是對什麼?

當我試圖從VS2012 RC中創建一個新項目(不存在項目的升級),我沒有看到的app.config

回答

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時觸發的自動安裝也可能不起作用。

+0

所以當用戶有.NET 4.0時,它會顯示錯誤,說.NET 4.5是該配置所必需的。如果該配置不在那裏呢?既然我已經瞄準了.NET 4.5,那麼它不會拋出錯誤嗎? – friend 2012-07-30 13:09:57

+0

是的,但很難解釋。像MissingMethodException或FileNotFoundException,不是一個友好的消息,如「你沒有.NET 4.5,你想我爲你安裝嗎?」看到http://stackoverflow.com/a/10033128/17034 – 2012-07-30 13:15:32

+1

@nobugz,我一直有點困惑,我需要與我的應用程序一起提供哪個版本的.NET。基於你上面的評論,我是否明白只有.NET 4.5 **的應用程序必須使.NET 4.5可用?換句話說,如果.NET 3.5,3.0等在系統上,我不必擔心。 – 2012-10-24 02:40:02

9

雖然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構建的項目確實有條目。

相關問題