長久以來,我發現有許多 .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 的應用程式,例如:
- 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
- .NET Framework 1.0
- CLR 1.1
- .NET Framework 1.1
- C# 1.1
- .NET Framework 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
- .NET Framework 2.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
- .NET Framework 4
※ 注意事項 ※
- 新版的 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 頁面。
Visual Studio 版本關聯
- Visual Studio .NET
- 支援 .NET Framework 1.0
- 可開發 ASP.NET 1.0
- 支援 .NET Framework 1.0
- Visual Studio 2003
- 支援 .NET Framework 1.1
- 可開發 ASP.NET 1.1
- 支援 .NET Framework 1.1
- Visual Studio 2005
- 支援 .NET Framework 2.0
- 可開發 ASP.NET 2.0
- 支援 .NET Framework 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
- 支援 .NET Framework 2.0
- 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
- 支援 .NET Framework 2.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 進行資料存取。
沒有留言:
張貼留言