2012-12-10 45 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來輕鬆地從在線編譯器中獲取結果。希望這有助於!