Я работаю над проектом отчета о кодах. В настоящее время я могу скомпилировать проекты решений, получить диагностику, связанную с компиляцией, и т.д. Проблема возникает, когда я пытаюсь загрузить мои пользовательские идентификационные анализаторы, я пытался использовать AnalyzerFileReference и AnalyzerImageReference без каких-либо результатов, Всегда я получаю доступ к проектам. Анализаторы пустые.
var inmutableArray = (new List<IDiagnosticAnalyzer>
{
new VariableEndedWithIdNamedCorrectlyDiagnosticAnalyzer()
}).ToImmutableArray();
var analyzerImageReference = new AnalyzerImageReference(inmutableArray);
foreach (Project project in solution.Projects)
{
project.AddAnalyzerReference(analyzerImageReference );
//No analizers loaded....
}
ОБНОВЛЕНИЕ (спасибо за отзыв [Josh Varty])
Я пробовал это двумя способами:
var newProjects = new List<Project>();
foreach (Project project in solution.Projects)
{
var newSolutionn= solution.AddAnalyzerReference(project.Id, analyzerImageReference);
newProjects.Add(newSolutionn.Projects.FirstOrDefault(p=> p.Id == project.Id));
}
foreach (Project project in solution.Projects)
{
var newProject = project.AddAnalyzerReference( analyzerImageReference);
}
В обоих случаях загружаются анализаторы, но когда я получаю компиляцию, и я получаю диагностику, я не получаю вывод, связанный с этими анализаторами (я думаю, что они не вызываются в функции компиляции get).
var compilation = newProject.GetCompilationAsync().Result;
var diagnostics = compilation.GetDiagnostics();
Какие-либо предложения?
Я нашел способ сделать это:
public static Task<ImmutableArray<Diagnostic>> GetDiagnosticsAsync(this Compilation compilation, ImmutableArray<DiagnosticAnalyzer> analyzers, AnalyzerOptions options, CancellationToken cancellationToken = default(CancellationToken))
{
options = options ?? new AnalyzerOptions(ImmutableArray<AdditionalStream>.Empty, ImmutableDictionary<string, string>.Empty);
Compilation newCompilation = null;
var analyzerDriver = AnalyzerDriver.Create(compilation, analyzers, options, out newCompilation, cancellationToken);
newCompilation.GetDiagnostics(cancellationToken);
return analyzerDriver.GetDiagnosticsAsync();
}
Я опубликовал версию проекта с открытым исходным кодом, с которой я работал с помощью Roslyn, вы можете увидеть код и другую информацию, связанную с анализаторами и кодом.
Как я уже отмечал, большинство объектов Roslyn неизменны. Это означает, что такие методы, как AddAnalyzerReference()
, не мутируют проект, а вместо этого возвращают новый.
У меня нет анализатора, чтобы проверить это, но я считаю, что вы можете использовать следующее. Обратите внимание, что я использую Solution.AddAnalyzerReference()
вместо того, который вы использовали.
var inmutableArray =(new List<IDiagnosticAnalyzer>
{
new VariableEndedWithIdNamedCorrectlyDiagnosticAnalyzer()
}).ToImmutableArray();
var analyzerImageReference = new AnalyzerImageReference(inmutableArray);
Solution newSolution = solution;
//We iterate over the original solution
foreach (Project project in solution.Projects)
{
//But we save our work in the newSolution
newSolution = newSolution.AddAnalyzerReference(project.Id, analyzerImageReference);
}
//Now newSolution should contain all your changes.
//Maybe you want to save this reference?
solution = newSolution;
AddAnalyzerReference()
неAddAnalyzerReference()
проект, а возвращает новый проект. См .: source.roslyn.codeplex.com/#Microsoft.CodeAnalysis.Workspaces/…