从命令行检查C#语法

8

有没有人知道在Microsoft .NET框架中检查给定C#文件语法的方法,仅限语法检查?

为了提供一些背景信息,我想设置syntastic来检查.cs文件的语法。开箱即用,syntastic使用Mono C#编译器及其--parse标志执行此操作,但是我找不到Microsoft .NET框架中的等效项。

我尝试让它起作用的第一步是使用csc /target:library /nologo代替mcs --parse,但问题在于它是按文件调用的。因此,它报告缺少名称空间(存在于完整项目构建中)而不仅仅是语法错误。


这样做的原因是什么? - mellamokb
4
为什么不只安装Mono呢? - Gabe Moothart
3个回答

2
您可以通过 Roslyn CTP 实现这一点。它允许您完整解析 .cs 文件,并遍历整个树,查找错误。
对于详细信息,我建议下载 C# 语法分析入门演示文稿教程,因为它向您展示了在 C# 文件中查看语法树的基本方法。

1

我以前在icsharpcode IDE中使用过NRefactory。对于基本的东西,它快速而简单。

看看这篇文章:使用NRefactory分析C#代码

我用它来从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库中编译。


这似乎是目前最好的与CLR实现无关的答案。 - Michael

0

我想我可能有一个解决你问题的方案。如果你想在不使用调试器的情况下检查代码的语法,你可以使用一个在线编译器,比如compilr。 如果你想输出结果,那么你可以使用这个神奇的API叫做Html Agility,轻松地从在线编译器中获取结果。希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接