Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#编译器:获取中间输出_C#_Compiler Construction - Fatal编程技术网

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

c#编译器:获取中间输出,c#,compiler-construction,C#,Compiler Construction,有没有一种方法可以指示c#编译器在编译的不同阶段输出源代码:删除语法糖后的源代码,…,IL 也许有些工具(Resharper?)可以做到这一点,但我想知道它们是如何做到的。不,没有。C#编译器不生成任何中间输出。它产生错误/警告或程序集 获取IL可以通过ildasm完成。这是一个与.Net一起提供的工具,它将显示程序集的原始IL 不,你能得到的最好的是白细胞介素。我相信一些AOP工具(比如)通过获取IL并用属性代码重写它来工作。你为什么这么问?你有什么事情要做吗?你应该看看微软的项目。它将构

有没有一种方法可以指示c#编译器在编译的不同阶段输出源代码:删除语法糖后的源代码,…,IL

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

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

获取IL可以通过ildasm完成。这是一个与.Net一起提供的工具,它将显示程序集的原始IL


不,你能得到的最好的是白细胞介素。我相信一些AOP工具(比如)通过获取IL并用属性代码重写它来工作。你为什么这么问?你有什么事情要做吗?

你应该看看微软的项目。它将构建过程公开为一组丰富的API。我相信这项工作不会是琐碎的,但你应该能够通过这种方式获得你想要的信息

有没有一种方法可以指示c#编译器在编译的不同阶段输出源代码:删除语法糖后的源代码,…,IL

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

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

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

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

如果这是您需要的分析类型,我鼓励您获得Roslyn的预览版。我们希望尽早得到反馈。下载内容如下:

反馈论坛在这里:

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

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


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

了解诸如lambda表达式之类的一些特性转换为什么会很有帮助。我想为此构建一个简单的工具。@ren如果这是您想要的,那么我建议您阅读Jon Skeet的《深入C#》第二版,因为它更好地解释了其中的一些内容。或者,您可以阅读CLR规范?最后,你可能会发现像LinqPad这样的工具很有用?我会试试LinqPad,谢谢。最好先看看,然后再看看:)我也会看看NRefactory。谢谢你对Roslyn做了更详细的解释。它看起来是一个了解系统内部的迷人窗口。