說出來不怕大家笑話,我一直搞不清楚一件事: .NET 2.0支援"向前相容"嗎?
(Backward Compatibility,雖然大家口語都習慣稱"支援以前的版本"叫"向前相容",但Backwards翻成向前有點怪,後面我會沿用MS的翻譯,稱為"回溯相容",以免混淆)

換句話說,.NET 1.1 Build出來的程式可以直接在.NET 2.0中跑嗎?

過去我對VS 2005的ASP.NET Project Upgrade Wizard的無痛升級十分讚賞,其中有一點很神奇的是,就算ASP.NET 1.1的專案參照了.NET 1.1開發的DLL檔,在變身成ASP.NET 2.0 Project後,馬照跑、舞照跳,順得很~~ 當時猜想其中說不定有什麼複雜的機制,找過Google並沒看到什麼相關的介紹(應該也是找得不夠用力),就很鄉愿地知其然不知其所以然傻傻活到今天。

這兩天在Vista上測試一個.NET 1.1開發的Window Form,無意間揭開了這個謎團...

我發現我的Window Form(.NET 1.1)程式在Vista上執行時,畫面顯示有點差異,跟曾經把專案轉到VS 2005裡跑時看到的一樣。仔細一查,原來我的Vista只有裝.NET 2.0,沒有裝.NET 1.1,所以Vista用.NET 2.0的Runtime在跑我用.NET 1.1 Build出來的WinForm exe。這下算是親眼見證了.NET 2.0的回溯相容能力,確定用.NET 2.0直接執行.NET 1.1 Build出來Binary Code是OK的(精確一點來說應該叫MSIL Code)。

MS官方文件裡有篇詳細的介紹,MSDN Magazine則有一篇.NET RD開發這一段功能的心路歷程

我歸納的心得如下:

  1. .NET Framework 2.0提供Side-by-Side(SxS) Execution及Backwards Compatibility來解決與1.1的相容問題。
  2. 在同時安裝1.1及2.0的作業平台上,.NET 1.1 App出來的程式會用.NET 1.1 Framework,.NET 2.0 App會跑2.0。(SxS)
  3. 在只有安裝2.0的作業平台上,.NET 1.1 App與.NET 2.0 App都會用2.0來跑。
  4. 原則上,.NET 1.1 App在.NET 2.0 Framework上執行時,絕大部分的功能都應正常無誤,但非100%,例如 我就遇至UI呈現結果不同的狀況。(Backwards)
  5. 若透過非.NET程式去啟動.NET程式時(最簡單的例子: 用.NET寫元件,包上COM Callable Wrapper, CCW變成ActiveX Control,提供給ASP呼叫),則會用最新的.NET Framework版本執行。
  6. 如果你想限制你的.NET 1.1 App只能用.NET 1.1 Framework跑(通常是用2.0跑會有問題又不想改Code時,呵),則可以利用config檔中的startup/supportedRuntime加以限定。

Comments

Be the first to post a comment

Post a comment