免责声明:我在 Microsoft 的 Roslyn 团队工作。
CodeDom 是 Roslyn 的前身,但关系不大。从本质上讲,CodeDom 是一种简单且(在某种程度上)与语言无关的方式来生成在 .NET 1.0 中添加的代码以支持设计人员(类似于 WinForms)。因为 CodeDom 试图提供一个可以用 C#、VB 和其他语言生成代码的统一模型,所以它对它支持的任何语言都缺乏高保真度(这就是你不能用 CodeDom 创建 switch 语句的原因)。CSharpCodeProvider.CompileAssemblyFromSource 只是执行 csc.exe 的包装器。
罗斯林是一种完全不同的动物。它是使用托管代码从头开始重写 C# 和 VB 编译器——C# 中的 C# 和 VB 中的 VB(今天发布的 csc.exe 和 vbc.exe 版本是用本机代码编写的)。在托管代码中构建它们的优点是用户可以将真正的编译器作为 .NET 应用程序的库引用(不需要包装器)。
在构建编译器管道的每个组件时,我们在顶部公开了公共 API:
- 解析器 -> 语法树 API
- 符号表/元数据导入 -> 符号 API
- Binder -> 绑定和流分析 API
- IL 发射器 -> 发射 API
Roslyn 可以用作复杂的 C# 和 VB 源代码生成器,但这就是与 CodeDom 的相似之处。Roslyn 编译器 API 可用于解析代码、执行语义分析、动态编译和评估代码等。
除了编译器之外,Roslyn 团队还在公共编译器 API之上重建 Visual Studio C# 和 VB IDE 功能。因此,编译器 API 足够丰富,可以构建 Visual Studio 设计时工具,例如 IntelliSense 和 Extract Method 重构。此外,在编译器之上的层,Roslyn 提供更高级别的分析或数据转换服务。例如,有一些服务可以使用 C# 和 VB 格式化规则来格式化代码,或者在解决方案中查找对特定符号的所有引用。
确实,Roslyn 对 CodeDom 的好处不止一个。CodeDom 满足了非常具体的代码生成需求,而 Roslyn 正在通过提供一个框架来解决整个语言工具空间,使您可以构建几乎任何类型的 C# 或 VB 语言工具。