Рабочее пространство Roslyn.OpenSolutionAsync(). Проекты всегда пусты?

Я пытаюсь создать самостоятельный проект WebAPI 2.0, который позволяет вам открывать/исследовать/строить .sln-решения через API.

Здесь код внутри одного из моих контроллеров, который должен возвращать список проектов с указанием пути к .sln:

public async Task<IHttpActionResult> GetProjects(string slnPath = "")
{
    var workspace = MSBuildWorkspace.Create();
    var solution = await workspace.OpenSolutionAsync(slnPath);
    var projects = solution.Projects;
}

Я ожидаю, что проекты будут содержать проекты в решении, но, согласно отладчику, solution.Projects и solution.ProjectIds всегда кажутся пустыми.

Я пробовал это с несколькими .sln файлами, все из которых я могу открыть в Visual Studio и видеть, что у них есть проекты.

Я видел этот вопрос, но мой проект не добавлен в Visual Studio, это библиотека классов, вызванная из приложения командной строки.

Ответы

Ответ 1

Это обычно вызвано одной из нескольких вещей в порядке общности:

  • Вам не хватает копий Microsoft.CodeAnalysis.CSharp.Workspaces.dll или Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll. Убедитесь, что при запуске вашего проекта эти DLL находятся рядом с основным Microsoft.CodeAnalysis.Workspaces.dll.

  • Вы загружаете решения с типами проектов, которые мы не поддерживаем. Мы должны поддерживать любой тип проекта, за исключением проектов без проекта. Библиотеки классов должны работать нормально.

  • У нас есть ошибка, которая заставляет нас неправильно обрабатывать ваши типы проектов. Если это произойдет, напишите ошибку на GitHub.

Ответ 2

Если вы получаете эту проблему в модульных тестах, но не в своем производственном коде, убедитесь, что вы указали как Microsoft.CodeAnalysis.CSharp.dll, так и Microsoft.CodeAnalysis.CSharp.Workspaces в своем тестовом проекте.

JYL упомянул об этом в комментариях выбранного ответа, но я не сразу его видел.