Я пытался написать анализатор, чтобы получить информацию о некоторых методах, используя синтаксическое дерево roslyn. Проблема в том, что анализатор, который я пишу, должен находиться в том же решении, что и решение, которое я хочу проанализировать. Итак, это мой код:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public static class Main
{
public static Solution solution { get; set; } = null;
public static string GetMethodInfo(string methodToFind)
{
Task<Solution> GetSolutionTask = null;
string namespaceToFind, classToFind, methodToFind, invocationToFind;
if (solution == null)
{
var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();
GetSolutionTask = workspace.OpenSolutionAsync(Config.SolutionPath);
}
if (GetSolutionTask != null) solution = GetSolutionTask.Result;
foreach (Project proj in solution.Projects)
{
Compilation compilation = proj.GetCompilationAsync().Result;
foreach (var tree in compilation.SyntaxTrees)
{
findMethodAndProcessIt()...
}
}
return String.Empty;
}
}
Проблема, которую я получаю, заключается в том, что ни одна компиляция не имеет синтаксического дерева. Я попробовал этот же код, открыв другие решения, и он работает. Таким образом, очевидно, что проблема заключается в том, чтобы попытаться открыть решение, которое использует визуальная студия. Я уже пытался запустить этот код с закрытой визуальной студией, запустив только .exe , но проблема не устранена. У вас есть идеи, как это решить?
Config.SolutionPath
? Имеет ли он правильное значение? Да, и кстати, если что-то очевидно является проблемой, скорее всего, это не так. - person Kris Vandermotten   schedule 04.08.2017