我常常不仅仅逛 博客园,还会去找国外,特别是台湾的技术部落格,发现好的文章,我便会收录,今天我转载或者全文复制,在Google 博客园,一位叫保哥,
釐清 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 編譯器平台,跟傳統編譯器的架構差別非常大,且編譯器本身開放原始碼。
- 初探 Roslyn 編譯器平台 (1): 從認識到使用 - MSDN 台灣部落格
- .NET Compiler Platform ("Roslyn") Overview
- .net - Microsoft Roslyn vs. CodeDom - Stack Overflow
(本篇文章有詳盡的 Roslyn 與 CodeDOM 差異比較) - 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?,請注意這兩者的差別,一個是垂直線是斜斜的,一個是水平線是斜斜的,後面那個才是對的,如下圖示:
- Visual
Studio - 是一種開發工具 (號稱地表最強),主要用來開發 .NET 應用程式。
- 但只要安裝特定外掛,也可以用來開發非 .NET 的應用程式,例如:
- Python Tools for Visual Studio (PTVS)
- Node.js Tools for Visual Studio (NTVS)
- PHP Tools for Visual Studio «
DEVSENSE s.r.o. - VS.Php |
PHP IDE for Windows (商用軟體) - Visual Studio 通常會內建許多專案範本,而且也不會支援所有版本的 .NET Framework,因此也跟 .NET Framework 有版本的相依性。
- 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# 相關書籍其實都會提到,這些書我不建議當成「參考書」來看,而是應該精讀,把知識內化成自己的東西,當有了好的知識基礎,其實學什麼東西都很快。
在未來的世界裡,大家比的並不是「經驗」或「技巧」,而是比誰學得快,比誰的「學習力」強,我們不是天才,學習能力不是與生俱來的,而是靠後天磨練出來的,如果你不花點時間在學習這件事上面,學習力怎麼可能會變強。因此,唯有不斷學習,跳離舒適圈,才能持續保持競爭力。有句話說得好:「接受改變,不如引領改變」,只要態度改變,未來就會不同,與大家共勉之! ^_^