Загрузите решение, в котором пишется Автономный анализатор кода

Я пытался написать анализатор, чтобы получить информацию о некоторых методах, используя синтаксическое дерево 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 , но проблема не устранена. У вас есть идеи, как это решить?


person Renato Campos    schedule 02.08.2017    source источник
comment
Что именно представляет собой ваш проект?   -  person SLaks    schedule 02.08.2017
comment
Цель моего проекта — извлечь информацию о вызовах определенных методов, а затем сгенерировать json-файлы с этой информацией, чтобы ее можно было отобразить на веб-портале документации проекта.   -  person Renato Campos    schedule 03.08.2017
comment
Откуда Config.SolutionPath? Имеет ли он правильное значение? Да, и кстати, если что-то очевидно является проблемой, скорее всего, это не так.   -  person Kris Vandermotten    schedule 04.08.2017
comment
Config.SolutionPath имеет правильное значение, это строка из другого класса. Если бы путь к решению был неправильным, решение даже не загрузилось бы, что не так.   -  person Renato Campos    schedule 04.08.2017
comment
см. мой ответ о том, как получить текущее решение из анализатора stackoverflow.com/a/44162871/1938988   -  person johnny 5    schedule 10.08.2017


Ответы (1)


Вы используете MSBuildWorkspace для открытия решения. Как правило, когда использование MSBuildWorkspace приводит к неправильной загрузке проектов, отсутствию исходных файлов и т. д., во время обработки msbuild произошел сбой. Обычно это происходит, когда ваше приложение не имеет тех же перенаправлений привязки в своем файле app.config, которые использует msbuild (в msbuild.exe.config), что приводит к сбою загрузки некоторых пользовательских задач/расширений из-за несоответствия версий.

Вы захотите скопировать раздел ‹assemblyBinding› в ваш app.config.

person Matt Warren    schedule 04.08.2017