如何自动加载Roslyn Analyzer(没有codefix)

时间:2016-05-16 07:18:41

标签: c# roslyn autoload visual-studio-extensions analyzer

TL; DR

  • 创建VSIX Package
  • 添加了Analyzer项目项
  • 按下F5。
  • 实验实例启动但分析器未加载且无法调试。
  • 手动添加分析仪。
  • 问题:如何自动加载分析仪?

问题描述:

有很多以项目模板开头的教程(甚至官方文档):Analyzer with Code Fix (NuGet + VSIX)。但是,在最新版本的.NET编译器平台中,我没有这样的项目模板。

所以,我创建了VSIX project。然后,我创建了一个Analyzer项目项。请注意,我没有CodeFix项,因为我不需要修改代码,只显示一些警告。

这就是我所得到的(我做了一些改动):

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class MyAnalyzer : DiagnosticAnalyzer
{
    public const string DiagnosticId = "MyAnalyzer";
    internal static readonly LocalizableString Title = "MyAnalyzer Title";
    internal static readonly LocalizableString MessageFormat = "MyAnalyzer";
    internal const string Category = "MyAnalyzer Category";

    internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, true);

    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics 
        => ImmutableArray.Create(Rule);

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.IfStatement);
    }           

    private void Analyze(SyntaxNodeAnalysisContext context)
    {
        IfStatementSyntax ifStatement = context.Node as IfStatementSyntax;

        if(ifStatement == null)
            return;

        context.ReportDiagnostic(
            Diagnostic.Create(
                Rule, 
                context.Node.GetLocation(), 
                "Hey, this is an IF statement."));
        }

    }
}

那就是它。该项目仅包含此文件,.vsixmanifestpackages.config

当我在调试模式下运行项目时(使用F5),实验实例已加载,我可以在Extensions and Updates中看到包。但是,没有命中断点(没有加载符号)并且分析器在分析器列表中(在解决方案资源管理器中)不可见。

然后我执行以下操作:

  • 将输出文件夹中的.vsix文件重命名为.vsix.zip并将其打开
  • 从zip
  • 中提取程序集DLL
  • 右键单击解决方案资源管理器中的分析器
  • 手动浏览/添加分析器的程序集DLL

然后突然加载符号,调试器在断点处停止。

有没有办法在实验实例中自动加载analzyer?我错过了一些配置吗?

1 个答案:

答案 0 :(得分:3)

VSIX模板可从Visual Studio gallery获得。

我怀疑你的vsix项目中缺少的是VSIX包清单中正确的组件列表。您需要在资产列表中定义MefComponentAnalyzer

enter image description here