如何自动加载 Roslyn 分析器(无代码修复)
How to autoload Roslyn Analyzer (without codefix)
TL;DR
- 已创建
VSIX Package
- 添加了
Analyzer
个项目
- 按了 F5。
- 实验实例启动,但分析器未加载,无法调试
- 手动添加分析器有效。
- 问题:如何自动加载分析器?
问题描述:
有很多教程(甚至是官方文档)都是从一个项目模板开始的:Analyzer with Code Fix (NuGet + VSIX)
。但是,在最新版本的.NET Compiler Platform中,我没有这样的工程模板。
所以,我创建了一个 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."));
}
}
}
就是这样。该项目仅包含此文件,一个 .vsixmanifest
和一个 packages.config
。
当我运行项目处于调试模式(使用F5)时,实验实例被加载,我可以在Extensions and Updates
中看到包。但是,未命中任何断点(未加载符号)并且分析器在分析器列表中不可见(在解决方案资源管理器中)。
然后我执行以下操作:
- 将输出文件夹中的 .vsix 文件重命名为 .vsix.zip 并打开它
- 从压缩文件中提取程序集 DLL
- 在解决方案资源管理器中右键单击分析器
- 手动browse/add分析器的程序集DLL
然后突然间,符号被加载,调试器在断点处停止。
有没有办法在实验实例中自动加载分析器?我是否缺少某些配置?
VSIX 模板可从Visual Studio gallery获得。
我怀疑您的 vsix 项目中缺少的是 VSIX 包清单中正确的组件列表。您需要在资产列表中同时定义 MefComponent
和 Analyzer
:
TL;DR
- 已创建
VSIX Package
- 添加了
Analyzer
个项目 - 按了 F5。
- 实验实例启动,但分析器未加载,无法调试
- 手动添加分析器有效。
- 问题:如何自动加载分析器?
问题描述:
有很多教程(甚至是官方文档)都是从一个项目模板开始的:Analyzer with Code Fix (NuGet + VSIX)
。但是,在最新版本的.NET Compiler Platform中,我没有这样的工程模板。
所以,我创建了一个 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."));
}
}
}
就是这样。该项目仅包含此文件,一个 .vsixmanifest
和一个 packages.config
。
当我运行项目处于调试模式(使用F5)时,实验实例被加载,我可以在Extensions and Updates
中看到包。但是,未命中任何断点(未加载符号)并且分析器在分析器列表中不可见(在解决方案资源管理器中)。
然后我执行以下操作:
- 将输出文件夹中的 .vsix 文件重命名为 .vsix.zip 并打开它
- 从压缩文件中提取程序集 DLL
- 在解决方案资源管理器中右键单击分析器
- 手动browse/add分析器的程序集DLL
然后突然间,符号被加载,调试器在断点处停止。
有没有办法在实验实例中自动加载分析器?我是否缺少某些配置?
VSIX 模板可从Visual Studio gallery获得。
我怀疑您的 vsix 项目中缺少的是 VSIX 包清单中正确的组件列表。您需要在资产列表中同时定义 MefComponent
和 Analyzer
: