【问题标题】:Roslyn CodeFixProvider isn't loading or running in the Visual Studio IDE. What am I missing?Roslyn CodeFixProvider 未在 Visual Studio IDE 中加载或运行。我错过了什么?
【发布时间】:2017-10-22 17:29:12
【问题描述】:

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

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

我错过了什么?

我尝试了以下方法:

  1. 添加了 SharedAttribute。
  2. 已将其命名空间更改为与分析器相同的命名空间。
  3. 确保 DiagnosticId 指向 Analyzer 使用的相同 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);
        }
    }
}

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 我知道你已经解决了这个问题,但这只是给其他到达这里的人的小费。如果其中包含 .,DiagnosticId 有时不起作用

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


【解决方案1】:

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

示例您在 vsixmanifest 中的资产选项卡应如下所示:

此外,对于创建分析器和代码修复提供程序,您应该从 Visual Studio 中Visual C# -&gt; Extensibility -&gt; Analyzer with Code Fix (NuGet + VSIX) 下的可用模板开始。所有必要的基础架构代码和设置都已经为您设置好了。

【讨论】:

  • 谢谢哥们。我还没有弄清楚,也没有时间玩。在将引用的项目列为 MefComponent 后,它立即工作..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2021-10-19
  • 2022-01-27
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多