免责声明:我在Roslyn团队为Microsoft工作。
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
- 活页夹->绑定和流分析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语言工具来解决整个语言工具领域。