2017-10-22 8 views
0

私は最初にDiagnosticAnalyzerと書いて、そのプロジェクトをVSIXマニフェストの資産としてリストアップするまでロードするように戦いました。Roslyn CodeFixProviderがVisual Studio IDEに読み込まれていないか、実行されていません。私は何が欠けていますか?

今度はCodeFixProviderをアナライザーと同じプロジェクトに追加しましたが、ロードされません。

私には何が欠けていますか?

私は次のことを試してみました:

  1. はSharedAttributeを追加しました。
  2. 名前空間をアナライザと同じ名前空間に変更しました。
  3. DiagnosticIdがAnalyzerで使用されているDiagnosticIdを指していることを確認してください。
  4. "C:\ Users \ユーザーcp321831 \のAppData \ローカル\マイクロソフト\ VisualStudioを\ 15.0_c657f3ebRoslyn \ ComponentModelCache" 削除:\ Users \ユーザーcp321831 \のAppData \ローカル\マイクロソフト\ VisualStudioを\ 15.0_c657f3ebExpディレクトリ
  5. は」Cを削除したが\ 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には、プロジェクトにMEFコンポーネントが含まれていることをVisual Studioに知らせるエントリがありません。 MEF (Managed extensibility framework)は、Visual Studio内でさまざまなコンポーネントを検出、登録、取得するために使用されます。 ExportCodeProviderAttributeは、実際にはExportAttributeに拡張されています。これは、これがMEFコンポーネントであることを示すマーカーとしてMEFによって使用されます。ただし、プロジェクトに拡張機能のMEFコンポーネントが含まれていることを指定する必要があります。そうしないと、検出は行われません。このため、コード修正プロバイダが検出されず、使用できませんでした。

vsixmanifestであなたの資産タブがどのように見えるべきか例:アナライザやコードの修正・プロバイダーを作成するためにも enter image description here

、あなたはVisual C# -> Extensibility -> Analyzer with Code Fix (NuGet + VSIX)でVisual Studioで利用可能であるテンプレートで始める必要があります。必要なインフラストラクチャのコードと設定はすべて既に設定されています。

+0

ありがとうございます。私はまだそれを理解していないし、遊ぶ時間がなかった。参照されたプロジェクトをMefComponentとしてリストした直後に動作しました。 –

関連する問題