C# Roslyn 分析器项目不想使用引用项目中的类和方法。如何让它发挥作用?

问题描述 投票:0回答:1

我们正在开发一个项目,使用 C# 分析器项目和 Roslyn API 通过扩展在代码中显示诊断信息。

我们注册一个SymbolAction,然后在AnalyzeSymbol 方法中调用引用项目中的静态类和方法。然而,当我们尝试调试扩展时。它不会发出诊断警告并且完全拒绝执行任何操作。

基本上,我们有一个名为 Recognize 的类库项目。位于不同项目中的分析器引用了 Recognize。我们尝试从 Recognize 调用静态方法以在分析器中返回字符串。示例代码将显示这一点。

两个项目都使用版本

netstandard2.0
。 Recognize 还使用语言版本 12,而不是使用默认语言的 Analyzer。

我们仅更改了当您创建“代码分析器和代码修复项目”时自动生成的AnalyzeSymbol 函数。 请注意

using Recognize;
Recognize.StaticTest.ReturnString()
会立即将字符串
"Test"
返回到诊断中:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
using Recognize;
using System;
using System.Collections.Immutable;
using System.Diagnostics;

namespace Analyzer
{
    [DiagnosticAnalyzer(LanguageNames.CSharp)]
    public class Analyzer : DiagnosticAnalyzer
    {
  
        public override void Initialize(AnalysisContext context)
        {
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
            context.EnableConcurrentExecution();

            context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);
        }

        private static void AnalyzeSymbol(SymbolAnalysisContext context)
        {
            context.ReportDiagnostic(Diagnostic.Create(SingletonDiagnosticDescriptor, context.Symbol.Locations[0], "Test"));
        
            context.ReportDiagnostic(Diagnostic.Create(SingletonDiagnosticDescriptor, context.Symbol.Locations[0], Recognize.StaticTest.ReturnString()));
        }
    }
}

无需运行 Recognize 中的方法即可正常工作。这是第一个

ReportDiagnostic
。尝试使用 Recognize 执行任何操作都不会为我们提供任何诊断信息。

由于未知的原因,调试对我们任何人都不起作用。我们不得不诉诸注释和注释代码行,并尝试各种方法才能使引用的项目正常工作。

例如,在Analyzer项目中创建一个内部类并尝试从那里运行Recognize的静态方法。这实际上让第一个

ReportDiagnostic
出现了。

通过执行上述操作并将调用内部类的整个代码块封装在 Try Catch 中,我们成功获得了错误消息:

无法加载文件或程序集“FuckRoslyn,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”。系统找不到文件

但不确定如何解决这个问题

调试会打开一个安装了扩展的特殊开发Visual Studio 2022。我们的断点都没有命中,也没有在原始 Visual Studio 的输出中得到与我们的扩展相关的堆栈跟踪或任何内容。扩展解决方案同时具有分析器和识别项目。

它似乎只是不想允许任何来自外界的东西。老实说,我们非常不知道下一步要做什么,因为我们假设我们可以将一些符号发送到 Recognize 来尝试在其上运行一些函数并返回诊断信息。

c# roslyn
1个回答
0
投票

为了解决分析器项目中使用的程序集加载问题,您需要执行以下操作:

  1. 转到您的扩展项目 (VSIX)
  2. 打开
    source.extension.vsixmanifest
  3. 前往资产
  4. 添加一个
    Microsoft.VisualStudio.Analyzer
    资产,其源是解决方案中的项目,然后选择您在分析器项目中引用的项目
  5. 添加一个
    Microsoft.VisualStudio.MefComponent
    资产,其源是解决方案中的项目,然后选择您在分析器项目中引用的项目

分析器项目现在应该能够找到程序集并使用它。

© www.soinside.com 2019 - 2024. All rights reserved.