2017-10-22 12 views
0

먼저 DiagnosticAnalyzer을 작성한 다음 프로젝트를 VSIX 매니페스트의 자산으로 나열 할 때까지로드되도록 처리했습니다.Roslyn CodeFixProvider가 Visual Studio IDE에서로드되거나 실행되지 않습니다. 내가 뭘 놓치고 있니?

이제 분석기와 동일한 프로젝트에 CodeFixProvider을 추가했지만로드되지 않습니다.

무엇이 누락 되었습니까?

  1. 추가 SharedAttribute :

    나는 다음 시도했다.
  2. 네임 스페이스를 분석기와 동일한 네임 스페이스로 변경했습니다.
  3. DiagnosticId가 분석기에서 사용하는 것과 동일한 DiagnosticId를 가리키는 지 확인하십시오.
  4. 은 삭제 "C를 : \ 사용자 \ cp321831 \의 AppData \ 로컬 \ 마이크로 소프트 \으로 VisualStudio \ 15.0_c657f3ebRoslyn \ ComponentModelCache"
  5. 는 "C 삭제 된 디렉토리 : \ 사용자 \ cp321831 \의 AppData \ 로컬 \ 마이크로 소프트 \으로 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); 
     } 
    } 
} 

: 여기

코드 해결사 코드입니다.

감사합니다.

+0

나는이 문제를 이미 풀었지만 여기에 오는 다른 사람들을위한 팁으로 알고 있습니다. DiagnosticId에'.'가 포함되어 있으면 가끔 작동하지 않습니다. –

답변

2

vsixmanifest에 Visual Studio에 프로젝트에 MEF 구성 요소가 포함되어 있다는 내용이 누락되어 있습니다. MEF (Managed extensibility framework)은 Visual Studio 내에서 다양한 구성 요소를 검색, 등록 및 검색하는 데 사용됩니다. ExportCodeProviderAttribute은 실제로 MEF가 마커로 사용하는 ExportAttribute으로 확장됩니다. 그러나 프로젝트에 확장을위한 MEF 구성 요소가 포함되도록 지정해야합니다. 그렇지 않으면 검색이 수행되지 않습니다. 이것이 코드 수정 공급자가 발견되지 않아서 사용할 수없는 이유입니다.

예 vsixmanifest에서 자산 탭과 같이 방법 : 분석기 및 코드 수정 공급자를 만드는 또한 enter image description here

, 당신은 Visual C# -> Extensibility -> Analyzer with Code Fix (NuGet + VSIX)에서 Visual Studio에서 볼 수 있습니다 템플릿으로 시작해야합니다. 필요한 모든 인프라 코드 및 설정이 이미 설정되어 있습니다.

+0

고마워요. 나는 아직도 그것을 알아 내지 못했고 놀 기회가 없었습니다. 참조 된 프로젝트를 MefComponent로 나열한 후 곧바로 작업했습니다. –