Roslyn CodeFixProvider未在Visual Studio IDE中加载或运行。我错过了什么?

时间:2017-10-22 17:29:13

标签: c# roslyn roslyn-code-analysis codefixprovider

我首先编写了一个DiagnosticAnalyzer,然后争取加载它,直到我将其项目列为VSIX清单中的资产。

现在我还在与分析器相同的项目中添加了CodeFixProvider,但它没有加载。

我错过了什么?

我尝试了以下内容:

  1. 添加了SharedAttribute。
  2. 将其名称空间更改为与分析器相同的名称空间。
  3. 确保DiagnosticId指向分析器使用的相同DiagnosticId。
  4. 删除了“C:\ Users \ cp321831 \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_c657f3ebRoslyn \ ComponentModelCache”目录
  5. 删除了“C:\ Users \ cp321831 \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_c657f3ebExp \ ComponentModelCache”目录
  6. 删除已完成的“15.0_c657f3ebRoslyn”和“15.0_c657f3ebExp”目录
  7. 我确定名称以CodeFixProvider结尾。
  8. 类型构造函数中的断点以及实例构造函数和任何方法都表明代码修复程序中没有任何内容被加载而且没有任何内容被击中。

    以下是代码修复程序的代码:

    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);
            }
        }
    }
    

    任何帮助都将不胜感激。

    感谢。

1 个答案:

答案 0 :(得分:3)

您缺少vsixmanifest中的条目,该条目告诉Visual Studio您的项目包含MEF组件。在Visual Studio中使用MEF (Managed extensibility framework)来发现,注册和检索不同的组件。 ExportCodeProviderAttribute实际上扩展了ExportAttribute,MEF使用它作为MEF组件的标记。但是,您必须指定项目包含扩展的MEF组件,否则不会发现发现。这就是您的代码修复提供程序未被发现且无法使用的原因。

示例vsixmanifest中的资产标签应如何显示: enter image description here

同样,对于创建分析器和代码修复提供程序,您应该从Visual C# -> Extensibility -> Analyzer with Code Fix (NuGet + VSIX)下的Visual Studio中可用的模板开始。将为您设置所有必要的基础设施代码和设置。