Roslyn CodeFixProvider 未加载或 运行 在 Visual Studio IDE 中。我错过了什么?
Roslyn CodeFixProvider isn't loading or running in the Visual Studio IDE. What am I missing?
我先写了一个 DiagnosticAnalyzer
然后努力让它加载,直到我将它的项目列为 VSIX 清单中的资产。
现在我还添加了一个 CodeFixProvider
到与分析器相同的项目,但它没有加载。
我错过了什么?
我尝试了以下方法:
- 添加了 SharedAttribute。
- 将其命名空间更改为与分析器相同的命名空间。
- 确保 DiagnosticId 指向分析器使用的同一个 DiagnosticId。
- 删除了 "C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio.0_c657f3ebRoslyn\ComponentModelCache" 目录
- 删除了 "C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio.0_c657f3ebExp\ComponentModelCache" 目录
- 删除了完整的“15.0_c657f3ebRoslyn”和“15.0_c657f3ebExp”目录
- 我确保名称以 CodeFixProvider 结尾。
类型构造函数、实例构造函数和任何方法中的断点表明,代码修复程序中没有任何内容被加载,也没有任何内容被命中。
这里是代码修复器的代码:
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);
}
}
}
如有任何帮助,我们将不胜感激。
谢谢。
您在 vsixmanifest
中缺少条目告诉 Visual Studio 您的项目包含 MEF 组件。 MEF (Managed extensibility framework) 在 Visual Studio 内部使用,用于发现、注册和检索不同的组件。 ExportCodeProviderAttribute
实际上扩展了 ExportAttribute
,它被 MEF 用作标记,表明这是 MEF 组件。但是,您必须指定您的项目包含用于扩展的 MEF 组件,否则不会发现。这就是您的代码修复提供程序未被发现且无法使用的原因。
示例 vsixmanifest 中的资产选项卡应如下所示:
另外,对于创建分析器和代码修复提供程序,您应该从 Visual C# -> Extensibility -> Analyzer with Code Fix (NuGet + VSIX)
下的 Visual Studio 中提供的模板开始。所有必要的基础架构代码和设置都已为您设置好。
我先写了一个 DiagnosticAnalyzer
然后努力让它加载,直到我将它的项目列为 VSIX 清单中的资产。
现在我还添加了一个 CodeFixProvider
到与分析器相同的项目,但它没有加载。
我错过了什么?
我尝试了以下方法:
- 添加了 SharedAttribute。
- 将其命名空间更改为与分析器相同的命名空间。
- 确保 DiagnosticId 指向分析器使用的同一个 DiagnosticId。
- 删除了 "C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio.0_c657f3ebRoslyn\ComponentModelCache" 目录
- 删除了 "C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio.0_c657f3ebExp\ComponentModelCache" 目录
- 删除了完整的“15.0_c657f3ebRoslyn”和“15.0_c657f3ebExp”目录
- 我确保名称以 CodeFixProvider 结尾。
类型构造函数、实例构造函数和任何方法中的断点表明,代码修复程序中没有任何内容被加载,也没有任何内容被命中。
这里是代码修复器的代码:
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);
}
}
}
如有任何帮助,我们将不胜感激。
谢谢。
您在 vsixmanifest
中缺少条目告诉 Visual Studio 您的项目包含 MEF 组件。 MEF (Managed extensibility framework) 在 Visual Studio 内部使用,用于发现、注册和检索不同的组件。 ExportCodeProviderAttribute
实际上扩展了 ExportAttribute
,它被 MEF 用作标记,表明这是 MEF 组件。但是,您必须指定您的项目包含用于扩展的 MEF 组件,否则不会发现。这就是您的代码修复提供程序未被发现且无法使用的原因。
示例 vsixmanifest 中的资产选项卡应如下所示:
另外,对于创建分析器和代码修复提供程序,您应该从 Visual C# -> Extensibility -> Analyzer with Code Fix (NuGet + VSIX)
下的 Visual Studio 中提供的模板开始。所有必要的基础架构代码和设置都已为您设置好。