【问题标题】:Roslyn Diagnostic Analyzer's diagnosis not reflecting in Visual Studio instanceRoslyn 诊断分析器的诊断未反映在 Visual Studio 实例中
【发布时间】:2015-06-28 08:37:11
【问题描述】:

我正在尝试检测模型是否作为参数传递给 MVC 应用程序的控制器中的函数。我为 Roslyn 诊断分析器编写了代码。当断点按预期命中时,代码背后的逻辑工作正常。但是警告方面的诊断结果并没有反映在打开的visual studio实例中。

这是我的诊断分析器的代码 sn-p:

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);
                }
            }
        }
    }
}

【问题讨论】:

  • 测试实例的错误或输出窗格中没有信息?
  • @JeroenVannevel 没有错误。但程序在输出窗口中显示以下异常: 抛出异常:System.Core.dll 中的“System.InvalidOperationException” 抛出异常:mscorlib.dll 中的“System.IO.FileLoadException” 抛出异常:“System.Threading.Tasks.TaskCanceledException”在 mscorlib.dll 中抛出:'System.Runtime.InteropServices.InvalidComObjectException' in mscorlib.dll
  • 您确定您拥有正确版本的分析器模板吗?您需要有一个与您安装的 VS 2015 相匹配的那个(即,如果您使用的是 RC,那么有 RC 模板)。此外,请确认您的分析器已安装在实例或项目中。
  • 您是否在WebApplication6.sln 上运行您的分析仪?在已构建的解决方案上打开 MSBuildWorkspace 时可能会遇到问题。
  • @JoshVarty 是的,我在不同的解决方案上运行分析器。

标签: c# visual-studio visual-studio-2015 roslyn


【解决方案1】:

看起来您搜索的类不正确。您应该根据上下文进行操作,并且不应该打开新的解决方案。上下文包含有关已打开解决方案的所有必要信息。

【讨论】:

  • 只要调用了context.ReportDiagnostic(),这并不重要,这并不能解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
相关资源
最近更新 更多