mel*_*okb 107 .net codedom roslyn
昨天在InfoWorld上关于新微软Roslyn的新闻稿中:
这种"解构"编译器最明显的优点是它允许从.Net应用程序内部调用整个编译执行过程.Hejlsberg演示了一个C#程序,它将一些代码片段作为字符串传递给C#编译器; 编译器将生成的IL汇编代码作为对象返回,然后将其传递到公共语言运行库(CLR)以供执行.瞧!使用Roslyn,C#获得了动态语言在运行时生成和调用代码的能力.
自从.NET 4发布以来,我已经能够做到这一点CSharpCodeProvider.CompileAssemblyFromSource
,实际上我在之前编写的一个ASP.Net项目中使用它实际上就是这样 - 允许用户在文本框中键入代码,选择程序集/名称空间引用,然后执行并显示该代码的输出,以便在Windows Azure上进行实时环境代码测试.
是CodeDom
Roslyn的一部分/前身吗?罗斯林的特殊好处是CodeDom
什么?
Dus*_*ell 235
免责声明:我在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:
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语言工具.
Ree*_*sey 42
CodeDom允许您编译 - 但它不能让您真正获得有关代码本身的信息(编译器错误除外).基本上,它是一个黑盒子,你说"编译这个",它说"我成功了"或"我失败了,这里有一些错误".
Roslyn允许您在运行中完全检查和构建代码.这包括能够查看/检查一段源代码中的注释,有关完整结构的详细信息等等.您可以浏览并获取传递给Roslyn的源代码的完整语法树,并进行详细分析或者对它进行转换.
鉴于完整,丰富的语法信息,您拥有大量额外的控制和灵活性.例如,这是一个复制C#代码块并将其粘贴为VB.NET代码的示例.使用Roslyn,您可以做的不仅仅是编译 - 您还可以干净地操作代码本身.这应该使得很多工具变得更加简单,因为重构之类的东西可以非常简单地完成,因为工具可以理解完整的语法,包括元信息(如注释),并且可以直接使用它.
Sim*_*ier 11
我看到的一个很大的区别是:使用CodeDom,每次编译一些C#或VB.NET时,它都会在进程外发生.CSC.exe或VBC.exe是幕后真正的工作者.
如果你想在架构,可扩展性,隔离等方面构建一个服务(你提到Azure),这不是很好.
随着罗斯林,它正在进行中.
我想这是他们称之为"编译器即服务"的原因之一.
此外,CodeDom是一个相对较差的API,错过了很多功能,并不是真正的最新版本,因为它主要是为了支持Visual Studio UI设计器自动代码生成而设计的.我认为Roslyn会做得更好,因为它是编写编译器的人写的.我希望这会有所作为.
PS:与CSC.exe和VBC.exe的一个显着区别:Roslyn似乎是纯.NET(并使用CCI).
Roslyn允许对整个过程进行更精细的控制 - 例如,您可以分析字符串,甚至生成其他代码(基于分析在编译过程中即时生成)等.
CodeDom是"只使用编译器",而Roslyn是"编译器作为一个具有完全访问(子)部分的服务"......使用Roslyn你"在编译器内部"并且可以从编译器的角度看看代码是什么样的允许您以目前无法实现的方式改变事物.
例如,您可以使用Roslyn来扩展C# - 这非常方便,并且比AOP实现的当前状态要好得多.
有关当前Roslyn状态及其提供的不同访问和控制级别的概述,请参阅http://msdn.microsoft.com/en-us/hh500769
UPDATE
微软刚刚提供了一个新的CTP,其中包含其他功能和许多API更改/添加功能.详情请见此处.