2012-12-10 121 views
8

有谁知道在Microsoft .NET框架中检查给定C#文件的语法和语法的方法吗?从命令行检查C#语法

有一点背景,我有兴趣设置syntastic来检查.cs文件的语法。开箱即用,Synthetic使用带有--parse标志的Mono C#编译器来执行此操作,但在Microsoft .NET框架中我找不到任何等价物。

我第一次尝试这个工作是使用csc /target:library /nologo代替mcs --parse,但问题是这是在每个文件的基础上调用的。因此,它会报告缺少的命名空间(存在于完整的项目构建中),而不仅仅是语法错误。

+0

这样做的原因是什么? – mellamokb

+4

为什么不安装单声道? –

回答

1

我以前用过icsharpcode IDE的NRefactory。对于基本的东西来说,它很快且容易。

看到这篇文章: Using NRefactory for analyzing C# code

我用它来创建从C#示例VB.NET例子。这是否真的是直线前进,并可以很容易地适应您的需求的方法:

private static void ConvertLanguage(TextReader input, TextWriter output, SupportedLanguage language, Action<string> onError) 
    { 
     using (IParser parser = ParserFactory.CreateParser(language, input)) 
     { 
      parser.Parse(); 
      var specials = parser.Lexer.SpecialTracker.RetrieveSpecials(); 
      var result = parser.CompilationUnit; 
      //if (parser.Errors.Count > 0) 
      // MessageBox.Show(parser.Errors.ErrorOutput, "Parse errors"); 

      IOutputAstVisitor outputVisitor; 
      if (language == SupportedLanguage.CSharp) 
       outputVisitor = new VBNetOutputVisitor(); 
      else 
       outputVisitor = new CSharpOutputVisitor(); 

      outputVisitor.Options.IndentationChar = ' '; 
      outputVisitor.Options.IndentSize = 4; 
      outputVisitor.Options.TabSize = 4; 

      using (SpecialNodesInserter.Install(specials, outputVisitor)) 
       result.AcceptVisitor(outputVisitor, null); 

      if (outputVisitor.Errors.Count > 0 && onError != null) 
       onError(outputVisitor.Errors.ErrorOutput); 

      output.Write(outputVisitor.Text); 
     } 
    } 

注:前面的代码是从旧版本,并可能无法编译反对NRefactory库的最新版本。

+0

这似乎是那里最好的CLR实现独立答案。 – Michael

0

我想我可能有解决您的问题。如果你试图在没有进入调试器的情况下检查你的代码的语法,你可以使用在线编译器作为compilr。 如果你想输出结果,那么你可以使用这个叫做Html Agility的惊人API来轻松地从在线编译器中获取结果。希望这有助于!