寻找C#代码解析器

我正在寻找一组类(最好在.net框架中),它将解析C#代码并返回带有参数,类及其方法,属性等的函数列表。理想情况下,它将提供构建我自己所需的所有内容。智能感知。

我觉得这样的东西应该在.net框架中,考虑到它们提供的所有reflection内容,但如果没有,那么开源替代方案就足够了。

我正在尝试构建的内容基本上类似于Snippet Compiler,但有一点扭曲。 我想弄清楚如何首先获得代码dom。

我试着谷歌搜索,但我不确定这是什么正确的术语,所以我空了。

编辑:因为我希望将它用于类似intellisense的处理,实际编译代码将无法工作,因为它很可能是不完整的。 对不起我应该先提到。

虽然.NET的CodeDom命名空间为代码语言解析器提供了基本API ,但它们并未实现。 Visual Studio通过自己的语言服务完成此操作。 这些在可再发行框架中不可用。

你可以……

  1. 编译代码然后在生成的程序集上使用reflection
  2. 看看像Mono C#编译器那样创建这些语法树的东西。 它不是像CodeDom这样的高级API,但也许你可以使用它。

CodePlex或类似网站上可能存在某些内容 。

UPDATE
看到这篇相关的post。 C#的解析器

如果你需要它来处理不完整的代码,或者代码中有错误的代码,那么我相信你几乎都是你自己的(也就是说,你将无法使用CSharpCodeCompiler类或类似的东西)。

像ReSharper这样的工具可以自己解析,但这是prorietary。 您可能可以从Mono编译器开始,但根据我的经验,编写一个解决不完整代码的解析器是一个完全不同的球赛,可以编写一个只是在不完整代码上吐出错误的球。

如果您只需要类和方法的名称(基本上是元数据),那么您可以“手动”进行解析,但我想这取决于您需要的结果准确度。

Mono项目GMCS编译器包含一个非常可重用的C#4.0解析器。 并且,编写自己的解析器相对容易,它将满足您的特定需求。 例如,您可以重复使用: http : //antlrcsharp.codeplex.com/

Microsoft.CSharp命名空间中查看CSharpCodeCompiler 。 您可以使用CSharpCodeCompiler进行编译,并使用CompilerResults.CompiledAssembly访问结果程序集。 关闭该assembly,您将能够获得类型和类型,您可以使用reflection获得所有属性和方法信息。

性能将非常平均,因为您需要在发生变化时编译所有源代码。 我不知道有任何方法可以让你逐步编译代码片段。

您是否尝试过使用Microsoft.CSharp.CSharpCodeProvider类? 这是一个支持CodeDom的完整C#代码提供程序。 您只需要在文本流上调用.Parse(),然后返回CodeCompileUnit。

 var codeStream = new StringReader(code); var codeProvider = new CSharpCodeProvider(); var compileUnit = codeProvider.Parse(codeStream); // compileUnit contains your code dom 

好吧,看到上面的内容不起作用(我刚测试过),下面的文章可能会引起人们的兴趣。 很久以前我给它添加了书签,所以我相信它只支持C#2.0,但它可能仍然值得:

直接从C#或VB.NET生成Code-DOM

对于Blindy来说可能有点晚了,但我最近发布了一个C#解析器,它非常适合这类事情,因为它设计用于处理代码片段并保留注释: C#Parser和CodeDOM

它处理C#4.0以及新的“异步”function。 它是商业的,但只是其他商业编译器成本的一小部分。

我真的认为很少有人意识到解析C#有多难,特别是如果你需要正确解析符号引用(这通常是必需的,除非你只是在做格式化)。 只是尝试阅读并完全理解500+页面语言规范的类型推断部分。 然后,冥想规范实际上并不完全正确的事实(如Eric Lippert本人所述)。