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



自从 .NET 4 发布 CSharpCodeProvider.CompileAssemblyFromSource 以来,我已经能够做到这一点,我实际上在不久前编写的 ASP.Net 项目中使用了它,它正是这样做的 - 允许用户在文本框中输入代码,选择程序集/要引用的命名空间,然后即时执行和显示该代码的输出,以便在 Windows Azure 上进行实时环境代码测试。
CodeDom 是罗斯林的前身吗? Roslyn 对 CodeDom 的特殊好处是什么?

最佳答案

免责声明 :我在 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 版本是用 native 代码编写的)。在托管代码中构建它们的优点是用户可以将真正的编译器作为来自 .NET 应用程序的库(不需要包装器)来引用。

在构建编译器管道的每个组件时,我们在顶部公开了公共(public) API:

  • 解析器 -> 语法树 API
  • 符号表/元数据导入 -> 符号 API
  • 绑定(bind)器 -> 绑定(bind)和流分析 API
  • IL 发射器 -> 发射 API

  • Roslyn 可以用作复杂的 C# 和 VB 源代码生成器,但这就是与 CodeDom 的相似之处。 Roslyn Compiler API 可用于解析代码、执行语义分析、动态编译和评估代码等。

    除了编译器之外,Roslyn 团队还在公共(public)编译器 API 之上重建 Visual Studio C# 和 VB IDE 功能。因此,编译器 API 足够丰富,可以构建 Visual Studio 设计时工具,例如 IntelliSense 和提取方法重构。此外,在编译器之上的层,Roslyn 为更高级别的分析或数据转换提供服务。例如,有一些服务可以使用 C# 和 VB 格式规则来格式化代码,或者在解决方案中查找对特定符号的所有引用。

    确实,Roslyn 对 CodeDom 的特殊好处不止一个。 CodeDom 满足了非常具体的代码生成需求,而 Roslyn 则通过提供一个框架来解决整个语言工具领域,让您可以构建您能想到的几乎任何类型的 C# 或 VB 语言工具。

    关于.net - 微软 Roslyn 与 CodeDom,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7852926/

    10-13 08:30