Microsoft Roslyn与CodeDom

时间:2011-10-21 17:17:31

标签: .net codedom roslyn

昨天在InfoWorld上press release关于新Microsoft Roslyn

  

这种“解构”编译器最明显的优点是   它允许从中调用整个编译执行过程   在.Net应用程序中。 Hejlsberg展示了一个C#程序   将一些代码片段作为字符串传递给C#编译器;编译器   返回生成的IL汇编代码作为对象,然后   传递到公共语言运行时(CLR)执行。瞧!同   Roslyn,C#获得了动态语言生成和调用的能力   代码在运行时。

自从.NET 4发布CSharpCodeProvider.CompileAssemblyFromSource以来,我已经能够做到这一点,我实际上在前一段时间编写的ASP.Net项目中使用了它,它确实允许用户输入代码在文本框中,选择要引用的程序集/命名空间,然后即时执行并显示该代码的输出,以便在Windows Azure上进行实时环境代码测试。

CodeDom是罗斯林的前身的一部分吗?罗斯林对CodeDom的特殊好处是什么?

4 个答案:

答案 0 :(得分:229)

免责声明:我在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:

  • Parser - >语法树API
  • 符号表/元数据导入 - > Symbol API
  • Binder - >绑定和流分析API
  • IL Emitter - >发出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语言工具。

答案 1 :(得分:41)

CodeDom允许您编译 - 但它不能让您真正获得有关代码本身的信息(编译器错误除外)。基本上,它是一个黑盒子,你说“编译这个”,它说“我成功了”或“我失败了,这里有一些错误”。

Roslyn允许您在运行中完全检查和构建代码。这包括能够查看/检查一段源代码中的注释,有关完整结构的详细信息等等。您可以浏览并获取传递给Roslyn的源代码的完整语法树,并进行详细分析或者对它进行转换。

鉴于完整,丰富的语法信息,您拥有大量额外的控制和灵活性。例如,这是一个复制C#代码块并将其粘贴为VB.NET代码的示例。使用Roslyn,您可以做的不仅仅是编译 - 您还可以干净地操作代码本身。这应该使得很多工具变得更加简单,因为重构之类的东西可以非常简单地完成,因为工具可以理解完整的语法,包括元信息(如注释),并且可以直接使用它。

答案 2 :(得分:10)

我看到的一个很大的不同:使用CodeDom,每次编译一些C#或VB.NET时,它都会在进程外发生。 CSC.exe或VBC.exe是幕后真正的工作者。

如果你想在架构,可扩展性,隔离等方面构建服务(你提到Azure),这不是很好。

罗斯林正在进行中。

我认为这是他们称之为“编译器即服务”的原因之一。

此外,CodeDom是一个相对较差的API,错过了很多功能,并且不是最新的,因为它主要是为了支持Visual Studio UI设计器自动代码生成而设计的。我认为Roslyn会做得更好,因为它是编写编译器的人写的。我希望这会有所作为。

PS:与CSC.exe和VBC.exe的一个显着区别:Roslyn似乎是纯.NET(并使用CCI)。

答案 3 :(得分:7)

Roslyn允许对整个过程进行更精细的控制 - 例如,您可以分析字符串,甚至生成其他代码(基于分析在编译过程中即时实现)等。

CodeDom是“只使用编译器”,而Roslyn是“编译器作为一个具有完全访问(子)部分的服务”......使用Roslyn你“在编译器内部”并且可以看到代码的样子编译器透视图,允许您以当前不可能的方式更改内容。

例如,您可以使用Roslyn扩展C# - 非常方便,并且比AOP实现的当前状态要好得多。

有关当前Roslyn状态及其提供的不同访问和控制级别的概述,请参阅http://msdn.microsoft.com/en-us/hh500769

<强>更新

Microsoft刚刚提供了一个新的CTP,其中包含其他功能和大量API更改/添加功能。有关详细信息,请参阅here