C# Roslyn CodeFixProvider isn';t在Visual Studio IDE中加载或运行。我错过了什么?
我首先编写了一个C# Roslyn CodeFixProvider isn';t在Visual Studio IDE中加载或运行。我错过了什么?,c#,roslyn,roslyn-code-analysis,codefixprovider,C#,Roslyn,Roslyn Code Analysis,Codefixprovider,我首先编写了一个DiagnosticanAnalyzer,然后努力让它加载,直到我在VSIX清单中将它的项目列为资产 现在,我还将CodeFixProvider添加到与analyzer相同的项目中,但它不会加载 我错过了什么 我尝试了以下方法: 添加了SharedAttribute 将其命名空间更改为与分析器相同的命名空间 确保诊断ID指向分析仪使用的同一诊断ID 删除了“C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio\15.0\U
DiagnosticanAnalyzer
,然后努力让它加载,直到我在VSIX清单中将它的项目列为资产
现在,我还将CodeFixProvider
添加到与analyzer相同的项目中,但它不会加载
我错过了什么
我尝试了以下方法:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Capitec.CodeAnalysis.Diagnostics
{
[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
public sealed class UserInteractionCodeFixProvider : CodeFixProvider
{
private const string Title = "Invoke mapped function instead";
static UserInteractionCodeFixProvider()
{
}
public UserInteractionCodeFixProvider()
{
}
public override ImmutableArray<string> FixableDiagnosticIds =>
ImmutableArray.Create(
AutomationScriptAnalyzerOfReplacableUserInteractions.DiagnosticId);
public override FixAllProvider GetFixAllProvider()
{
return WellKnownFixAllProviders.BatchFixer;
}
public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken)
.ConfigureAwait(false);
var diagnostic = context.Diagnostics.First();
var span = diagnostic.Location.SourceSpan;
var invocation = ResolveInvocation(root, span);
context.RegisterCodeFix(
CodeAction.Create(
Title,
ct => InvokeFunctionInstead(context.Document, invocation, ct),
equivalenceKey: Title),
diagnostic);
}
private InvocationExpressionSyntax ResolveInvocation(SyntaxNode root, TextSpan span)
{
return root
.FindToken(span.Start)
.Parent
.AncestorsAndSelf()
.OfType<InvocationExpressionSyntax>()
.First();
}
private Task<Document> InvokeFunctionInstead(
Document document,
InvocationExpressionSyntax invocation,
CancellationToken cancellationToken)
{
return Task.FromResult(document);
}
}
}
使用Microsoft.CodeAnalysis;
使用Microsoft.CodeAnalysis.CodeActions;
使用Microsoft.CodeAnalysis.CodeFixes;
使用Microsoft.CodeAnalysis.CSharp.Syntax;
使用Microsoft.CodeAnalysis.Text;
使用System.Collections.Immutable;
使用系统组成;
使用System.Linq;
使用系统线程;
使用System.Threading.Tasks;
命名空间Capitec.CodeAnalysis.Diagnostics
{
[ExportCodeFixProvider(LanguageNames.CSharp),共享]
公共密封类UserInteractionCodeFixProvider:CodeFixProvider
{
private const string Title=“改为调用映射函数”;
静态UserInteractionCodeFixProvider()
{
}
public UserInteractionCodeFixProvider()
{
}
公共覆盖ImmutableArray FixableDiagnostics=>
ImmutableArray.Create(
AutomationScriptAnalyzeZerofReplacableUserInteractions.DiagnosticId);
公共覆盖FixAllProvider GetFixAllProvider()
{
返回WellKnownFixAllProviders.BatchFixer;
}
公共重写异步任务注册表CodeFixesAsync(CodeFixContext上下文)
{
var root=await context.Document.GetSyntaxRootAsync(context.CancellationToken)
.配置等待(错误);
var diagnostic=context.Diagnostics.First();
var span=diagnostic.Location.SourceSpan;
var invocation=ResolveInvocation(根,跨度);
context.RegisterCodeFix(
代码动作。创建(
标题
ct=>InvokeFunction(context.Document,invocation,ct),
等效键:标题),
诊断性);
}
private InvocationExpressionSyntax ResolveInvocation(SyntaxNode根,TextSpan)
{
返回根
.FindToken(span.Start)
父母亲
.AncestorsAndSelf()
第()类
.First();
}
私有任务调用函数(
文件,
调用ExpressionSyntax调用,
取消令牌(取消令牌)
{
返回任务.FromResult(文档);
}
}
}
任何帮助都将不胜感激
谢谢。您的
vsixmanifest
中缺少条目,它告诉Visual Studio您的项目包含MEF组件。在VisualStudio中用于发现、注册和检索不同的组件ExportCodeProviderAttribute
实际上扩展了MEF用作标记这是MEF组件的ExportAttribute
。但是,您必须指定项目包含用于扩展的MEF组件,否则不会发生发现。这就是您的代码修复提供程序未被发现且无法使用的原因
vsixmanifest中的资产选项卡的外观示例:
同样对于创建分析器和代码修复提供程序,您应该从Visual Studio中可用的模板开始,该模板位于
Visual C#->Extensibility->Analyzer with code fix(NuGet+VSIX)
下。将为您设置所有必要的基础结构代码和设置。谢谢。我还没有弄明白,也没有时间玩。在把被引用的项目列为MefComponent之后,它马上就起作用了。我知道你已经解决了这个问题,但这只是给其他来到这里的人的一个提示。如果DiagnosticId中包含
,则它有时不起作用