4

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

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

4

4 回答 4

8

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

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

于 2012-04-06T15:06:49.723 回答
7

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

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

正如 Jon 正确指出的那样,Roslyn 编译器会。Roslyn 将以树的形式公开完整的句法分析。但是,我们没有计划以“降低的树”的形式公开句法或语义转换。(例如,查询理解降低为方法调用,foreach 循环降低为 while 循环,using 语句降低为 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?)可以做到这一点,但我想知道他们是如何做到的。

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

于 2012-04-06T17:46:43.483 回答
1

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

于 2012-04-06T15:08:33.040 回答
1

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

于 2012-04-06T15:25:15.123 回答