먼저 DiagnosticAnalyzer
을 작성한 다음 프로젝트를 VSIX 매니페스트의 자산으로 나열 할 때까지로드되도록 처리했습니다.Roslyn CodeFixProvider가 Visual Studio IDE에서로드되거나 실행되지 않습니다. 내가 뭘 놓치고 있니?
이제 분석기와 동일한 프로젝트에 CodeFixProvider
을 추가했지만로드되지 않습니다.
무엇이 누락 되었습니까?
- 추가 SharedAttribute : 나는 다음 시도했다.
- 네임 스페이스를 분석기와 동일한 네임 스페이스로 변경했습니다.
- DiagnosticId가 분석기에서 사용하는 것과 동일한 DiagnosticId를 가리키는 지 확인하십시오.
- 은 삭제 "C를 : \ 사용자 \ cp321831 \의 AppData \ 로컬 \ 마이크로 소프트 \으로 VisualStudio \ 15.0_c657f3ebRoslyn \ ComponentModelCache"
- 는 "C 삭제 된 디렉토리 : \ 사용자 \ cp321831 \의 AppData \ 로컬 \ 마이크로 소프트 \으로 VisualStudio \ 15.0_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);
}
}
}
: 여기
코드 해결사 코드입니다.감사합니다.
나는이 문제를 이미 풀었지만 여기에 오는 다른 사람들을위한 팁으로 알고 있습니다. DiagnosticId에'.'가 포함되어 있으면 가끔 작동하지 않습니다. –