c#compiler:得到中间输出

时间:2012-04-06 15:04:59

标签: c# compiler-construction

有没有办法指示c#编译器在编译的不同阶段输出源:删除语法糖后的源,...,IL。

也许有些工具(Resharper?)会这样做,但我想知道他们是如何做到的。

4 个答案:

答案 0 :(得分:7)

不,没有。 C#编译器不会产生任何中间输出。它会产生错误/警告或装配。

可以使用ildasm完成IL。这是一个附带.Net的工具,它将显示程序集的原始IL

答案 1 :(得分:7)

  

有没有办法指示c#编译器在编译的不同阶段输出源:删除语法糖后的源,...,IL。

正如Jared正确指出的那样,你当然可以看到IL。编译器此时不会公开有关其分析的更多信息。

正如Jon正确指出的那样,Roslyn编译器会。 Roslyn将以树的形式公开完整的语法分析。但是,我们没有计划以“降低树”的形式公开语法或语义转换。 (例如,查询推导降低到方法调用,foreach循环降低到while循环,使用降低到try-finally语句的语句,等等。)

我们计划公开一个API,允许您对我们的语义分析引擎进行查询。例如,你可以说“给我这个程序的句法分析”,然后说“好吧,这个节点在语法分析中就是一个表达式;它的类型是什么?”或者“重载决策是什么决定了这个调用实际调用的方法?”等等。

我们还计划公开允许您对流分析引擎进行查询的API。例如,您将能够获取语法树,然后询问“在此方法中给定此代码块,在控制进入块之前未分配哪些局部变量,但是在控制离开后将分配哪些局部变量?”

如果这是您需要的分析,我建议您获取Roslyn的预览版本。我们希望获得尽可能多的早期反馈。下载地点在这里:

http://www.microsoft.com/download/en/details.aspx?id=27746

反馈论坛在这里:

http://social.msdn.microsoft.com/forums/en-us/roslyn

有关Roslyn的更多信息,请访问:

http://msdn.microsoft.com/en-us/roslyn

  

也许有些工具(Resharper?)会这样做,但我想知道他们是如何做到的。

他们编写自己的语法和语义分析器。

答案 2 :(得分:1)

不,你能得到的最好的是IL。我相信一些AOP工具(如PostSharp)通过获取IL并使用属性代码重写它。你为什么要问?你有什么想做的吗?

答案 3 :(得分:1)

您应该查看Microsoft的Roslyn项目。它将构建过程公开为一组丰富的API。我相信这项工作将是非平凡的,但你应该能够以这种方式获得你正在寻找的信息。