C# 编译器:获取中间输出

本文关键字:中间 输出 获取 编译器 | 更新日期: 2023-09-27 18:30:27

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

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

C# 编译器:获取中间输出

不,

没有。 C# 编译器不会生成任何中间输出。 它要么产生错误/警告,要么产生程序集。

获得 IL 可以通过 ildasm 完成。 这是 .Net 附带的工具,将显示程序集的原始 IL

  • http://msdn.microsoft.com/en-us/library/aa309387(v=vs.71).aspx

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

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

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

我们确实计划公开一个API,该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?)可以做到这一点,但我想知道他们是如何做到这一点的。

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

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

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