繁体   English   中英

Roslyn CodeFixProvider未在Visual Studio IDE中加载或运行。 我想念什么?

[英]Roslyn CodeFixProvider isn't loading or running in the Visual Studio IDE. What am I missing?

我首先编写了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结尾。

类型构造函数以及实例构造函数和任何方法中的断点表明,代码修复程序中未加载任何内容,也未命中任何内容。

这是代码修复程序的代码:

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组件。 在Visual Studio内部使用MEF(托管可扩展性框架)来发现,注册和检索不同的组件。 ExportCodeProviderAttribute实际上扩展了ExportAttribute ,该ExportAttribute由MEF用作这是MEF组件的标记。 但是,您必须指定您的项目包含扩展的MEF组件,否则不会发生发现。 这就是为什么您的代码修复提供程序未被发现并且无法使用的原因。

vsixmanifest中资产标签的示例如下所示: 在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM