2014-08-28 228 views
2

我很新的.NET和C#。如何使一個應用程序兼容.NET 4.0和.NET 4.5

我最近接手了將我的應用程序從.NET 4.0升級到.NET 4.5的任務,以跟上我團隊中的其他產品。

我希望能夠在.NET 4和.NET 4.5上運行我的應用程序(它有幾個項目,基於ASP .NET和一些獨立應用程序項目(控制檯應用程序)的一些Web項目)。

以下說明網上關於<supportedRuntime> Element通過改變目標運行時我意識到compilation元素的targetFramework屬性是現在4.5從.NET 4.0升級到.NET 4.5之後。我明白,這意味着代碼肯定會在.NET框架4.5上工作。

如果我有一組正在等待4.5升級並仍在運行.NET 4.0的節點,該怎麼辦?我很確定我的更改會破壞應用程序。

因此,我做了一些研究,並在參考了一些在線文檔後,刪除了解決方案中項目的*.config文件中的supportedRuntime元素的sku屬性。儘管supportedRuntime元素的version屬性仍爲v4.0(CLR版本)。我希望這可以讓應用程序在.NET Framework 4.0和4.5上運行。

但我對compilation元素及其重要性知之甚少,除了我從ASP .NET configuration guidelines讀到的內容。離開targetFramework是否確保我的應用程序可以在.NET 4.0和.NET 4.5上運行?

如何確保我的更改與.NET 4.0和.NET 4.5兼容?

[爲什麼不把它作爲.NET 4.0,直到節點有自己的.NET框架的升級?]

你可能會問,爲什麼我不能保持其作爲.NET 4.0的現在。 目標是升級到.NET 4.5。但獨立腳本運行在不支持.NET 4.5的Windows Server 2003上運行的一組節點上。我已經讓我的系統管理團隊單獨爲這個過程分配另一個帶有.NET 4.5的節點。所以暫時我不能完全升級現有的代碼。直到我測試了.NET 4.5上的現有代碼並將部署配置到這些新節點之後。 感謝來自@ hvd的評論,該評論在我困惑的大腦中點燃了一個燈泡。現在我知道如何繼續。

+3

我可能會錯過某些東西,但爲什麼不直接將應用程序保存爲.NET 4.0?這應該已經適用於.NET 4.5系統。 – hvd 2014-08-28 10:16:56

+0

謝謝@ hvd,它非常有意義。現在我該如何解決這個問題。 – 2014-08-28 10:32:34

回答

10

.NET Framework的版本控制不同於運行時版本(CLR和抖動)。在以前的版本中已經是這樣,.NET 2.0,3.0,3.5和3.5SP1使用運行時版本v2.0.50727。

多的4.0分支相同,版本4.0,4.0.1,4.0.2,4.0.3,4.5,4.5.1和4.5.2都使用相同的運行時版本,v4.0.30319

添加了「sku」屬性以向CLR提供額外的檢查,以確保機器上存在正確的框架版本。並且權力this feature,非常可取。沒有它,你的4.5目標項目將在只有4.0安裝的機器上啓動。但是往往會遇到一個非常醜陋的運行時異常,通常是由缺少的類型或方法引起的。特別是4.5中的變化頗具影響力,類型從一個組件轉移到另一個組件,以使便攜式設備上的框架佔用空間更小。 This question就是一個很好的例子,診斷非常難看。

一個很好的例子,說明這是如何出錯的是EventWaitHandle.WaitOne(int)過載。在.NET 2.0SP2(又名3.5)中添加。一個好主意,沒有人知道如何正確使用WaitOne(int,bool)重載。但是在mscorlib的[AssemblyVersion]中沒有相應變化的突變。導致可怕的問題,程序員使用過度津津有味,但他們的程序運行在舊版本的.NET時失敗。帶有MissingMethodException的Kaboom,幾乎不知道如何簡單和常見的方法可能會丟失。

冷酷的事實是,如果您在您的項目中定位4.5並刪除sku,那麼您將得到處理這種痛苦。你有目標4.0保持兼容性,當然很簡單。

+0

感謝有關CLR和框架的詳細信息。 – 2014-09-04 14:51:01

2

事實上,如果你改變框架版本4.0在項目屬性,你就可以確保在設計時4.5議會成員(命名空間,類,接口,...)將不可見/開發時間。或者,如果您嘗試使用版本4.5中的成員,編譯器會哭。

這是可能的最佳方式,以確保您不會使用以前的.NET Framework版本中不存在的較新成員。

相關問題