The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係

長久以來,我發現有許多 .NET 開發人員其實不是很熟悉自己每天都在面對的 .NET Framework, C#, Visual Studio 與 ASP.NET 版本之間的關係,以至於經常在找資料時下錯關鍵字,不容易命中想找的資料,今日特別撰文說明這幾項技術與工具在各版本之間的關係。

名詞定義

下列這些名詞,寫 .NET 的人一定都不陌生,但你是否有真正理解呢?如果看了我的摘要文字說明還無法理解的話,建議多查詢相關文件或書籍,或直接在文章最下方留言討論。

  • CLR ( Common Language Runtime )
    • CLR 是 .NET Framework 的虛擬機器元件 (virtual machine component),用來管理執行中的 .NET 程序。
    • CLR 有個重要的流程是 JIT 編譯 (just-in-time compilation) 機制,可以將 .NET 程式編譯過的 中繼語言 (Intermediate language) 編譯為當前 CPU 架構可執行的機器碼 (machine instructions)。
    • CLR 提供記憶體管理型別安全例外處理垃圾回收機制 (GC)、安全性執行緒管理等服務。
    • 無論什麼程式語言,只要是基於 .NET 框架的程式,都必須執行於 CLR 提供的執行環境(虛擬機器)中。
    • CLR 包含一系列 基礎類別函式庫 (BCL) ( Base Class Libraries ),用來提供 .NET 執行時期需要的程式基礎。
    • 在該函式庫中含有一堆 組件 (Assembly) 與 型別 (Type) 定義,如命名空間、類別、介面、列舉、… 等等。
  • .NET
    • .NET Framework 的簡稱,有時候泛指 .NET 相關的各種技術。
    • .NET Framework 包含一系列 框架類別函式庫 ( FCL ) ( Framework Class Libraries ),用來擴充 BCL 不足的地方。
  • C#
    • 是一種 型別安全 (Type-safe) 的 物件導向 (object-oriented) 的程式語言 (Programming Language)
    • 這裡的 型別安全 泛指所有的 C# 物件都是具有型別的,例如 Int32, String, StringBuilder, … 等等都是型別,在各型別的繼承關係中,最上層的型別為 object
    • C# 包含一套 編譯器 (Compiler),可將 C# 程式碼編譯為 .NET 中繼語言 ( IL ) (Intermediate language),執行檔為 csc.exe
    • C# 編譯器在編譯時,可以透過 /langversion 參數指定其編譯的版本,目前支援 ISO-1、ISO-2、3、4、5 等版本。
    • C# 6.0 開始,採用全新的 Roslyn 編譯器平台,跟傳統編譯器的架構差別非常大,且編譯器本身開放原始碼。
    • C# 6.0 的 csc.exe 編譯器改由 NuGet 進行安裝,如需在專案中使用 C# 6.0 語法,則需額外安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 套件。
    • 在開發應用程式的時候又有區分「強型別」與「弱型別」的開發方式。
      • 強型別:存取物件資料時,不需要額外轉型的開發方法,凡事都用明確的型別來表達與傳遞資料。
      • 弱型別:存取物件資料時,用較為抽象的型別來保存資料,需要用到資料時再透過轉型得到真正的型別。
    • 程式語言都有「語言特性」,有些 C# 的語言特性會需要用到 .NET Framework 的特定類別,因此 C# 通常會與 .NET Framework 有版本的相依性。
    • C# 的正確讀音是 C-Sharp,我曾經聽過有人唸成 C-Hash 是錯誤的唸法!
    • 補充一個有趣的點,其實 C# 並不是寫成 C#,而是 C♯,請注意這兩者的差別,一個是垂直線是斜斜的,一個是水平線是斜斜的,後面那個才是對的,如下圖示: 
      image 
  • Visual Studio
  • ASP.NET ( ASP.NET 官方網站 )
    • ASP.NET 自 2002 年一月推出的一套網頁開發框架,早期只有 ASP.NET Web Form 架構,直到 2009 年推出以 MVC 為主的開發框架 ( ASP.NET MVC 1.0 ),微軟預計在 2016 Q1 推出 ASP.NET 5 框架 (基於 ASP.NET MVC 的改進)。
    • 無論 ASP.NET Web Form 或 ASP.NET MVC 兩者都是 ASP.NET 框架的一部份,共用 ASP.NET 底層提供的各種函式庫。
    • 許多人會把 ASP.NET 簡稱為 ASP 其實是不洽當的,由於 ASP.NET 之前的網頁開發技術為 ASP (Active Server Page),簡稱 ASP 會導致溝通上的混亂。
    • 目前已推出的 ASP.NET Web Form 版本有
      • ASP.NET 1.0
      • ASP.NET 1.1
      • ASP.NET 2.0
      • ASP.NET 3.5
      • ASP.NET 4.0
      • ASP.NET 4.5
      • ASP.NET 4.6
    • 目前已推出的 ASP.NET MVC 版本有
      • ASP.NET MVC 1.0
      • ASP.NET MVC 2.0
      • ASP.NET MVC 3.0
      • ASP.NET MVC 4.0
      • ASP.NET MVC 5.x
      • ASP.NET MVC 6.0 ( 目前還在 beta 階段,此版本等同於 ASP.NET 5 版本 )

 

CLR 版本關聯

  • CLR 1.0
    • .NET Framework 1.0
      • C# 1.0
  • CLR 1.1
    • .NET Framework 1.1
      • C# 1.1
  • CLR 2.0
    • .NET Framework 2.0
      • C# 2.0
    • .NET Framework 3.0
      • C# 2.0
    • .NET Framework 3.5
      • C# 3.0
  • CLR 4
    • .NET Framework 4
      • C# 4.0
    • .NET Framework 4.5
      • C# 5.0
    • .NET Framework 4.5.1
      • C# 5.0
    • .NET Framework 4.5.2
      • C# 5.0
    • .NET Framework 4.6 ( 又稱 .NET 2015 )
      • C# 6.0

 

※ 注意事項 ※

  • 新版的 C# 編譯器通常可以編譯舊版的 C# 原始碼,也就是 C# 6.0 編譯器通常有能力編譯 C# 1.0 ~ 6.0 的程式碼,但編譯時一次只能選擇一個版本進行編譯。

 

.NET Framework 版本關聯

若要查詢 .NET Framework 與各版本的關係,建議可參考 .NET Framework Versions and Dependencies 網頁的表格說明,以下為摘要說明:

  • .NET Framework 1.0
    • 使用 CLR 1.0 版,需搭配 C# 1.0 編譯器
    • 內建於 Visual Studio .NET 開發工具
  • .NET Framework 1.1
    • 使用 CLR 1.1 版,需搭配 C# 1.1 編譯器
    • 內建於 Visual Studio 2003 開發工具
    • 推出 ASP.NET 1.1 版,支援 ADO.NET 資料存取技術
  • .NET Framework 2.0
    • 使用 CLR 2.0 版,需搭配 C# 2.0 編譯器
    • 內建於 Visual Studio 2005 與之後的每一版 Visual Studio 開發工具
    • 從 Visual Studio 2005 開始就不再支援 .NET 1.1 開發,因此開發 .NET 1.1 應用程式必須安裝 Visual Studio 2003
    • 推出 ASP.NET 2.0 版,增強 ASP.NET 功能 (並且與 ASP.NET 1.1 不相容),並支援泛型
  • .NET Framework 3.0
    • 使用 CLR 2.0 版,需搭配 C# 2.0 編譯器
    • 內建於 Visual Studio 2005 與之後的每一版 Visual Studio 開發工具
    • 主要針對 WPF, WCF, WF, CardSpace 功能進行強化,新增許多 FCL
  • .NET Framework 3.5
    • 使用 CLR 2.0 版,需搭配 C# 3.0 編譯器
    • 內建於 Visual Studio 2008 與之後的每一版 Visual Studio 開發工具
    • 主要針對 ASP.NET, LINQ, Dynamic Data, … 等許多功能進行強化,請參見 .NET Framework 的新功能 頁面說明
    • 推出 ASP.NET 3.5 版
  • .NET Framework 4
    • 使用 CLR 4 版,需搭配 C# 4.0 編譯器
    • 此版本 CLR 4 擴充了許多 BCL 類別庫
    • 內建於 Visual Studio 2010 與之後的每一版 Visual Studio 開發工具
    • 主要針對 BCL, Portable Class Library, MEF, DLR, code contracts, … 等許多功能進行強化,請參見 .NET Framework 4 的新功能 頁面說明
    • 推出 ASP.NET 4.0 版
  • .NET Framework 4.5
    • 使用 CLR 4 版,可搭配 C# 5.0 或 C# 6.0 編譯器
    • 內建於 Visual Studio 2012 與之後的每一版 Visual Studio 開發工具
    • 主要針對 WPF, WCF, WF, ASP.NET updates, … 等許多功能進行強化,也支援 Windows Store apps 開發,請參見 .NET Framework 的新功能 頁面說明
    • 推出 ASP.NET 4.5 版,並且統一了
  • .NET Framework 4.5.1
    • 使用 CLR 4 版,可搭配 C# 5.0 或 C# 6.0 編譯器
    • 內建於 Visual Studio 2013 與之後的每一版 Visual Studio 開發工具
    • 主要針對 Automatic binding redirection, 偵錯功能, … 等許多功能進行強化,也支援 Windows Phone Store apps 開發,請參見 .NET Framework 的新功能 頁面說明
  • .NET Framework 4.5.2
    • 使用 CLR 4 版,可搭配 C# 5.0 或 C# 6.0 編譯器
    • 內建於 Visual Studio 2013 與之後的每一版 Visual Studio 開發工具
    • 主要針對 New APIs for transactional systems and ASP.NET, System DPI resizing in Windows Forms controls, Profiling improvements, ETW and stress logging improvements, … 等許多功能進行強化,請參見 .NET Framework 的新功能 頁面說明
  • .NET Framework 4.6 ( 又稱 .NET 2015 )
    • 使用 CLR 4 版,可搭配 C# 5.0 或 C# 6.0 編譯器
    • 內建於 Visual Studio 2013 與之後的每一版 Visual Studio 開發工具
    • 主要針對 Compilation using .NET Native, ASP.NET Core 5, Event tracing improvements, Support for page encodings, … 等許多功能進行強化,請參見 .NET Framework 的新功能 頁面說明
    • 推出 ASP.NET 5 Beta 5 (尚未正式版),關於 ASP.NET 5 的推出時程規劃請參見 ASP.NET 5 Schedule and Roadmap 頁面。

從上述整理的版本關聯關係中,你可以發現早期的 .NET Framework, CLR, C#, ASP.NET 版本之間是很容易記憶的,因為 .NET 1.1 搭配 CLR 1.1, C# 1.1 與 ASP.NET 1.1,而 .NET 2.0 搭配 CLR 2.0, C# 2.0 與 ASP.NET 2.0,到了 .NET 3.5 開始出現版本號的變化,因為 .NET 3.5 搭配著 CLR 2.0 與 C# 3.0,光是這點差異,在當時已經讓有些人混淆了,我相信到 2015 年的今天,還是有許多人搞不清楚。從 .NET 4 開始,是一個新的 CLR 版本的起點 ( CLR 4 ),需搭配 C# 4.0,算是好記許多。不過到了 .NET 4.5 有些功能就需要搭配 C# 5.0 才能編譯。

 

Visual Studio 版本關聯

  • Visual Studio .NET
    • 支援 .NET Framework 1.0
      • 可開發 ASP.NET 1.0
  • Visual Studio 2003
    • 支援 .NET Framework 1.1
      • 可開發 ASP.NET 1.1
  • Visual Studio 2005
    • 支援 .NET Framework 2.0
      • 可開發 ASP.NET 2.0
  • Visual Studio 2008
    • 支援 .NET Framework 2.0
      • 可開發 ASP.NET 2.0
    • 支援 .NET Framework 3.0
      • 與 ASP.NET 無關
    • 支援 .NET Framework 3.5
      • 可開發 ASP.NET 3.5, ASP.NET MVC 1.0
      • 支援 Entity Framework 3.5
  • Visual Studio 2010
    • 開始支援 Visual Studio 擴充套件
    • 開始使用 NuGet 管理 .NET 套件
    • 支援 .NET Framework 2.0
      • 可開發 ASP.NET 2.0
    • 支援 .NET Framework 3.0
      • 與 ASP.NET 無關
    • 支援 .NET Framework 3.5
      • 可開發 ASP.NET 3.5, ASP.NET MVC 2.0
      • 支援 Entity Framework 4.x
    • 支援 .NET Framework 4.0
      • 可開發 ASP.NET 4.0, ASP.NET MVC 3.0, ASP.NET MVC 4.0
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0 (僅 runtime 支援,可編譯,沒有設計工具)
  • Visual Studio 2012
    • 支援 .NET Framework 2.0
      • 可開發 ASP.NET 2.0
    • 支援 .NET Framework 3.0
      • 與 ASP.NET 無關
    • 支援 .NET Framework 3.5
      • 可開發 ASP.NET 3.5
      • 支援 Entity Framework 4.x
    • 支援 .NET Framework 4.0   ( 從 .NET 4.5 開始預設採用 C# 4.0 編譯器 )
      • 可開發 ASP.NET 4.0, ASP.NET MVC 3.0, ASP.NET MVC 4.0, ASP.NET MVC 5.0
    • 支援 .NET Framework 4.5
    • 支援 .NET Framework 4.5.1
    • 支援 .NET Framework 4.5.2
      • 可開發 ASP.NET 4.5, ASP.NET MVC 3.0, ASP.NET MVC 4.0, ASP.NET MVC 5.0
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0
  • Visual Studio 2013
    • 專案範本預設改用 NuGet 管理套件
    • 支援 .NET Framework 2.0
      • 可開發 ASP.NET 2.0
    • 支援 .NET Framework 3.0
      • 與 ASP.NET 無關
    • 支援 .NET Framework 3.5
      • 可開發 ASP.NET 3.5
      • 支援 Entity Framework 4.x
    • 支援 .NET Framework 4.0
      • 可開發 ASP.NET 4.0, ASP.NET MVC 4.0, ASP.NET MVC 5.0
    • 支援 .NET Framework 4.5   ( 從 .NET 4.5 開始預設採用 C# 5.0 編譯器 )
    • 支援 .NET Framework 4.5.1
    • 支援 .NET Framework 4.5.2
      • 可開發 ASP.NET 4.5, ASP.NET MVC 4.0, ASP.NET MVC 5.0
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0
    • 支援 .NET Framework 4.6
      • 可開發 ASP.NET 4.6
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0
  • Visual Studio 2015
    • 專案範本預設改用 NuGet 管理套件
    • 支援 .NET Framework 2.0
      • 可開發 ASP.NET 2.0
    • 支援 .NET Framework 3.0
      • 與 ASP.NET 無關
    • 支援 .NET Framework 3.5
      • 可開發 ASP.NET 3.5
      • 支援 Entity Framework 4.x
    • 支援 .NET Framework 4.0
      • 可開發 ASP.NET 4.0, ASP.NET MVC 4.0, ASP.NET MVC 5.0
    • 支援 .NET Framework 4.5   ( 從 .NET 4.5 開始預設採用 C# 6.0 編譯器 )
    • 支援 .NET Framework 4.5.1
    • 支援 .NET Framework 4.5.2
      • 可開發 ASP.NET 4.5, ASP.NET MVC 5.0
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0
    • 支援 .NET Framework 4.6
      • 可開發 ASP.NET 4.6, ASP.NET MVC 5.0
      • 可開發 ASP.NET 5 / ASP.NET MVC 6 (目前還在 beta 階段)
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0
      • 支援 Entity Framework 7.x (目前還在 beta 階段)
    • 支援 .NET Core 5
      • 可開發 ASP.NET 5 / ASP.NET MVC 6 (目前還在 beta 階段)
      • 支援 Entity Framework 5.0
      • 支援 Entity Framework 6.0
      • 支援 Entity Framework 7.x (目前還在 beta 階段)

 

※ 注意事項 ※

  • Entity Framework 7 將會是一套全新的 Entity Framework 版本,與前版的 Entity Framework 6 是兩套完全不同的產品。
  • 在同一個專案下,就算同時載入 Entity Framework 6 與 Entity Framework 7 也不會發生任何衝突或互相影響。
  • 就算你用 ASP.NET 5 開發網站,一樣可以使用 Entity Framework 6 進行資料存取。

 

心得分享

我個人其實是從 .NET Framework 2.0 開始進入 .NET 的世界,時光飛逝、歲月如梭,想不到一轉眼 .NET 也寫了將近 10 年了,寫這篇文章讓我回想起 .NET 的演變歷史,我看到了許多技術與框架的興起與衰落,看起來好像每年都在學新的東西,也聽到許多朋友感慨從事 Web / IT 這行好辛苦。當然,從事程式設計這一行,沒有興趣與熱情,確實很難持續進步,但有了興趣與熱情,如果沒有好的基礎,一樣難以為繼,因為每隔幾年就要丟棄原本熟悉的知識,重新學習新的,當然辛苦!

不過在我看來,其實這 10 年來,雖然累積的觀念與知識不少,但其實每年新增的東西會用到的並不多,有些東西用到在學即可,但重點就在於,你真的「學會」了嗎?很多時候,我們為了趕專案,為了解決一個問題,由於基礎知識不足,自己寫不出來,於是上網找到了一段可以執行的原始碼,就直接複製貼上到你的程式碼中,雖然程式可以跑,但其實你並沒有真正「學會」這段程式碼背後的觀念,以至於每次遇到類似的需求,都要不斷找範例、不斷嘗試寫法,沒辦法一次寫對。

我個人面對這些龐雜知識的觀念是這樣的,對於基礎知識,例如 C# 語言特性,就算用不到,也要找時間補齊觀念,因為這是最基礎的東西,學會了這些才有機會掌握每一行程式碼的精隨,也能減少記憶程式碼的負擔。例如 BCL 與 FCL 擁有大量的類別庫,不可能全部學會的,但有些常用的函式庫,就算沒用到也應該先熟悉,其他少用的類別庫,等用到再來學即可,這些函式庫在市面上的 C# 相關書籍其實都會提到,這些書我不建議當成「參考書」來看,而是應該精讀,把知識內化成自己的東西,當有了好的知識基礎,其實學什麼東西都很快。

在未來的世界裡,大家比的並不是「經驗」或「技巧」,而是比誰學得快,比誰的「學習力」強,我們不是天才,學習能力不是與生俱來的,而是靠後天磨練出來的,如果你不花點時間在學習這件事上面,學習力怎麼可能會變強。因此,唯有不斷學習,跳離舒適圈,才能持續保持競爭力。有句話說得好:「接受改變,不如引領改變」,只要態度改變,未來就會不同,與大家共勉之! ^_^

留言評論