Roslyn 诊断分析器的诊断结果在 Visual Studio 实例中未能体现

3
我正在尝试在MVC应用程序的控制器中,将模型作为参数传递到函数中进行检测。我编写了一个Roslyn诊断分析器的代码。代码背后的逻辑是正常工作的,因为断点按预期被触发。但是,警告的诊断结果没有反映在打开的Visual Studio实例中。
以下是我的诊断分析器代码片段:
public override void Initialize(AnalysisContext context)
{
    // TODO: Consider registering other actions that act on syntax instead of or in addition to symbols
    context.RegisterSyntaxNodeAction(AnalyzeSymbol, SyntaxKind.MethodDeclaration);
}

private async static void AnalyzeSymbol(SyntaxNodeAnalysisContext context)
{
    var method = (MethodDeclarationSyntax)context.Node;

    ParameterListSyntax ParamList = method.ParameterList;
    int flag = 0;
    string ParamName = null;

    foreach (ParameterSyntax Param in ParamList.Parameters)
    {
        if (Param.Type.ToString().Contains("Model"))
        {
            ParamName = Param.Type.ToString();
            flag = 1;
            break;
        }
    }

    if (flag == 0)
        return;

    string solutionPath = @"C:\Users\Administrator\Documents\Visual Studio 2015\Projects\WebApplication6\WebApplication6.sln";
    var workspace = MSBuildWorkspace.Create();                                                       
    var solution = await workspace.OpenSolutionAsync(solutionPath);

    foreach (var project in solution.Projects)
    {
        foreach (var document in project.Documents)
        {
            CancellationToken source = default(CancellationToken);

            SyntaxNode root = await document.GetSyntaxRootAsync(source);

            var classDeclarations = root.DescendantNodes().Where(n => n.IsKind(SyntaxKind.ClassDeclaration));
            flag = 0;

            foreach (ClassDeclarationSyntax cls in classDeclarations)
            {
                if (cls.Identifier.Text.ToString() == ParamName)
                {

                        var diagnostic = Diagnostic.Create(Rule, method.GetLocation());
                        context.ReportDiagnostic(diagnostic);
                }
            }
        }
    }
}

测试实例的错误或输出窗格中没有信息? - Jeroen Vannevel
@JeroenVannevel 没有错误。但程序在输出窗口中显示以下异常: 在 System.Core.dll 中引发了“System.InvalidOperationException”的异常 在 mscorlib.dll 中引发了“System.IO.FileLoadException”的异常 在 mscorlib.dll 中引发了“System.Threading.Tasks.TaskCanceledException”的异常 在 mscorlib.dll 中引发了“System.Runtime.InteropServices.InvalidComObjectException”的异常 - Harjatin
你确定你有正确版本的分析器模板吗?你需要使用与你的VS 2015安装相匹配的模板(例如,如果你正在使用RC,则需要RC模板)。此外,请验证你的分析器是否已安装在实例或项目中。 - John Koerner
你是在WebApplication6.sln上运行你的分析器吗?如果解决方案已经在构建中,你可能会在打开MSBuildWorkspace时遇到问题。 - JoshVarty
@JoshVarty 是的,我正在对另一个解决方案运行分析器。 - Harjatin
可能与此错误有关:https://github.com/dotnet/roslyn/issues/3748 - John Koerner
1个回答

0

看起来你正在错误地搜索类。你应该操作上下文,而不是打开新的解决方案。上下文包含有关已打开解决方案的所有必要信息。


1
只要调用了 context.ReportDiagnostic(),那就不应该真的有什么问题,但这并不能解决问题。 - StingyJack

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