﻿# 關於 Roslyn 與 CodeDOM 的差別

最近由於開始動手研究 [Visual Studio 2015](https://www.visualstudio.com/en-us/products/vs-2015-product-editions.aspx)、[C# 6.0](https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6) 與 [Roslyn](https://github.com/dotnet/roslyn) 架構，也寫了幾篇文章分享，由於我的一個好友 [Lex Li](http://lextudio.com/) 分享了一篇[在 Stack Overflow 上的一篇文章](http://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom)，覺得講的蠻清楚的，因此特別翻譯這篇文章。

以下是 [.net - Microsoft Roslyn vs. CodeDom - Stack Overflow](http://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom) 這篇文章權威回答的內容翻譯：

> CodeDOM 是 Roslyn 的前身，但這兩者之間只有些微相關。基本上，CodeDOM 是一套簡單且與程式語言無關的方式產生程式碼，這是從 .NET 1.0 加入的一個功能，主要為了幫助 Visual Studio 的設計工具產生相對應的 C# 或 VB 程式碼。由於 CodeDOM 嘗試提供一個產生 C# 或 VB 或其他程式語言程式碼的通用模型，所以他必須符合各語言之間都通用的語言特性，因此使用 CodeDOM 產生的程式碼通常會失真（例如你無法透過 CodeDOM 產生 switch 語法）。而 CSharpCodeProvider.CompileAssemblyFromSource 也只是一個 csc.exe 的封裝而已，程式碼實際上還是透過 csc.exe 程式進行編譯的。
> 
> Roslyn 則是完全另一件事。他是一個特別為 C# 與 VB 個別從頭打造的編譯器，且完全用 Managed Code 撰寫而成。也就是 C# 編譯器是用 C# 寫的，VB 編譯器用 VB 寫的。在 Roslyn 之前的編譯器(csc.exe 或 vbc.exe)都是用原生碼(native code)寫成的。使用 Managed Code 打造編譯器的優點是，使用者可以將 Roslyn 函式庫直接加入參考到專案之中，且完全沒有其他原生函式庫的相依性。
> 
> 打造編譯器管線的每個元件時，我們在最上層揭露了幾個公開的 APIs：
> 
> -   Parser                          -> Syntax Tree API
> -   Symbol Table/Metadata Import    -> Symbol API
> -   Binder                          -> Binding and Flow Analysis APIs
> -   IL Emitter                      -> Emit API
> 
> ![Compiler pipeline APIs](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/96236db53267de56a047-image_2718.png)
> 
> Roslyn 可以當成複雜的 C# 與 VB 的程式碼產生器，只有這件事跟 CodeDOM 很像，但可以產生的程式碼是更加精準的，沒有任何限制。Roslyn 編譯器的 APIs 可以用來解析程式碼、執行語意分析、編譯程式碼、動態執行任何程式碼。
> 
> 除了編譯器之外，Roslyn 團隊也基於這些公開的編譯器 APIs 對 Visual Studio 2015 重新打造對 C# 與 VB 的功能支援。因此，這些編譯器的 APIs 已經足以支持 Visual Studio 建構一個完整的設計時期工具支援，像是 IntelliSense、擷取方法(Extract Method)等程式碼重構功能都可以辦到。同時，在編譯器這層之上，Roslyn 也提供了更高階的分析服務或數據轉換等功能。例如有服務可以提供基於 C# 與 VB 樣式規則而進行格式化程式碼的功能，或是在方案中依據特定符號(Symbol)尋找所有參考(Find All Reference)等功能。
> 
> ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/923d43f9e571b579e080-image_2719.png)
> 
> 說真的，這並不是用 Roslyn 替換 CodeDOM 的唯一效益，想當年 CodeDOM 解決了產生程式碼的特定需求，現今的 Roslyn 則是透過一個框架，解決了整個程式語言工具領域的需求，只要你想在開發工具上添加任何針對 C# 或 VB 的相關功能，你能想到的 Roslyn 通通辦的到。

以下有些相關連結，可供大家進一步了解 Roslyn 的相關知識。

**相關連結**

-   [初探 Roslyn 編譯器平台 (1): 從認識到使用 - MSDN 台灣部落格](https://learn.microsoft.com/en-us/archive/blogs/msdntaiwan/roslyn-1)
-   [.NET Compiler Platform ("Roslyn") Overview](https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/)
-   [Roslyn Project Overview](https://msdn.microsoft.com/en-us/hh500769)
-   [dotnet/roslyn](https://github.com/dotnet/roslyn) (GitHub)
-   [.NET Compiler Platform ("Roslyn"): Analyzers and the Rise of Code-Aware Libraries | Build 2015 | Channel 9](https://channel9.msdn.com/Events/Build/2015/3-725)
-   [What's New in C# 6 and Visual Basic 14 | Build 2015 | Channel 9](https://channel9.msdn.com/Events/Build/2015/3-711)
-   [The Future of C# | Build 2014 | Channel 9](https://channel9.msdn.com/Events/Build/2014/2-577)
-   [Abstract syntax tree - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Abstract_syntax_tree)
