Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Roslyn CodeFixProvider isn';t在Visual Studio IDE中加载或运行。我错过了什么?_C#_Roslyn_Roslyn Code Analysis_Codefixprovider - Fatal编程技术网

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相同的项目中,但它不会加载

我错过了什么

我尝试了以下方法:

  • 添加了SharedAttribute
  • 将其命名空间更改为与分析器相同的命名空间
  • 确保诊断ID指向分析仪使用的同一诊断ID
  • 删除了“C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio\15.0\U c657f3ebRoslyn\ComponentModelCache”目录
  • 删除了“C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio\15.0\U 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);
            }
        }
    }
    
    使用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中包含
    ,则它有时不起作用