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

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

### 名詞定義

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

-   [CLR](https://en.wikipedia.org/wiki/Common_Language_Runtime) ( 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](https://en.wikipedia.org/wiki/.NET_Framework)
    -   .NET Framework 的簡稱，有時候泛指 .NET 相關的各種技術。
    -   .NET Framework 包含一系列 **框架類別函式庫** ( FCL ) ( Framework Class Libraries )，用來擴充 BCL 不足的地方。
-   [C#](https://zh.wikipedia.org/wiki/C%E2%99%AF)

-   是一種 **型別安全** (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](https://github.com/dotnet/roslyn) 編譯器平台，跟傳統編譯器的架構差別非常大，且編譯器本身開放原始碼。

-   [初探 Roslyn 編譯器平台 (1): 從認識到使用 - MSDN 台灣部落格](https://learn.microsoft.com/en-us/archive/blogs/msdntaiwan/roslyn-1)
-   [.NET Compiler Platform ("Roslyn") Overview](https://github.com/dotnet/roslyn/wiki/Roslyn%20Overview)
-   [.net - Microsoft Roslyn vs. CodeDom - Stack Overflow](http://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom)  
    (本篇文章有詳盡的 Roslyn 與 CodeDOM 差異比較)

-   C# 6.0 的 **csc.exe** 編譯器改由 NuGet 進行安裝，如需在專案中使用 C# 6.0 語法，則需額外安裝 [Microsoft.CodeDom.Providers.DotNetCompilerPlatform](https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform) 套件。
-   在開發應用程式的時候又有區分「強型別」與「弱型別」的開發方式。
    -   **強型別**：存取物件資料時，不需要額外轉型的開發方法，凡事都用明確的型別來表達與傳遞資料。
    -   **弱型別**：存取物件資料時，用較為抽象的型別來保存資料，需要用到資料時再透過轉型得到真正的型別。
-   程式語言都有「語言特性」，有些 C# 的語言特性會需要用到 .NET Framework 的特定類別，因此 C# 通常會與 .NET Framework 有版本的相依性。
-   C# 的正確讀音是 C-Sharp，我曾經聽過有人唸成 C-Hash 是錯誤的唸法！
-   補充一個有趣的點，其實 C# 並不是寫成 **C#**，而是 **C♯**，請注意這兩者的差別，一個是垂直線是斜斜的，一個是水平線是斜斜的，後面那個才是對的，如下圖示：   
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3a9bd13cc6839d2b6d05-image_2712.png "image") 

-   [Visual Studio](https://www.visualstudio.com/)
    -   是一種開發工具 (號稱地表最強)，主要用來開發 .NET 應用程式。
    -   但只要安裝特定外掛，也可以用來開發非 .NET 的應用程式，例如：
        -   [Python Tools for Visual Studio](https://github.com/microsoft/PTVS) (PTVS)
            -   GitHub: [https://github.com/Microsoft/PTVS](https://github.com/Microsoft/PTVS "https://github.com/Microsoft/PTVS")
        -   [Node.js Tools for Visual Studio](https://www.visualstudio.com/features/node-js-vs) (NTVS)
            -   GitHub: [https://github.com/Microsoft/nodejstools](https://github.com/Microsoft/nodejstools "https://github.com/Microsoft/nodejstools")
        -   [PHP Tools for Visual Studio « DEVSENSE s.r.o.](http://www.devsense.com/products/php-tools "http://www.devsense.com/products/php-tools")
        -   [VS.Php | PHP IDE for Windows](https://web.archive.org/web/20170106181021/https://www.vsphp.com/) (商用軟體)
    -   Visual Studio 通常會內建許多專案範本，而且也不會支援所有版本的 .NET Framework，因此也跟 .NET Framework 有版本的相依性。
-   [ASP.NET](https://zh.wikipedia.org/wiki/ASP.NET) ( [ASP.NET 官方網站](http://www.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](https://msdn.microsoft.com/en-us/library/bb822049\(v=vs.110\).aspx) 網頁的表格說明，以下為摘要說明：

-   .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 的新功能](https://msdn.microsoft.com/library/ms171868\(v=vs.90\).aspx) 頁面說明
    -   推出 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 的新功能](https://msdn.microsoft.com/library/ms171868\(v=vs.100\).aspx) 頁面說明
    -   推出 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 的新功能](https://msdn.microsoft.com/zh-tw/library/ms171868\(v=vs.110\).aspx) 頁面說明
    -   推出 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 的新功能](https://msdn.microsoft.com/zh-tw/library/ms171868\(v=vs.110\).aspx) 頁面說明
-   .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 的新功能](https://msdn.microsoft.com/zh-tw/library/ms171868\(v=vs.110\).aspx) 頁面說明
-   .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 的新功能](https://msdn.microsoft.com/zh-tw/library/ms171868\(v=vs.110\).aspx) 頁面說明
    -   推出 ASP.NET 5 Beta 5 (尚未正式版)，關於 ASP.NET 5 的推出時程規劃請參見 [ASP.NET 5 Schedule and Roadmap](https://github.com/aspnet/Home/wiki/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# 相關書籍其實都會提到，這些書我不建議當成「參考書」來看，而是應該精讀，把知識內化成自己的東西，當有了好的知識基礎，其實學什麼東西都很快。

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