Как открыть текущее решение Visual Studio с помощью Microsoft.CodeAnalysis

Я разрабатываю расширение Visual Studio для анализа кода, расширение требует испускать dll для выбранного пользователем проекта, я выбрал библиотеку Microsoft.CodeAnalysis для испускания артефакта сборки для выбранного проекта.

Мне не удалось найти способ открыть текущее решение без указания пути к файлу sln (добавлен пример кода). Как получить текущий путь к sln? Любой альтернативный подход для создания артефакта сборки для выбранного проекта?

Редактировать: Мой вариант использования: Пользователь открывает VS IDE -> Открыть файл.cs -> Он выбирает опцию "Анализ", которая будет добавлена ​​из моего расширения -> Затем расширение должно скомпилировать проект, который содержит открытый файл.cs пользователя.

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;

using (var workspace = MSBuildWorkspace.Create())
{
    //Open current solution
    var solution = workspace.OpenSolutionAsync("C:\test\abc.sln").Result;

    //Select the project user is working on and build it
    //
}

2 ответа

Если вы пытаетесь получить рабочее пространство для открытого в данный момент проекта, вам не следует использовать MSBuildWorkspace. Вместо этого MEF импортирует VisualStudioWorkspace. Это актуально и актуально с кодом, который редактирует пользователь. Смотрите вопросы, как этот для получения дополнительной информации.

Как получить текущий путь SLN?

Вы можете получить текущий sln с помощью метода Dte.Solution.FullName, например так:

 DTE2 dte = (DTE2)this.ServiceProvider.GetService(typeof(DTE));
            ConfigurationManager configmgr;
            Configuration config;

            var solution = dte.Solution;

            if (dte.Solution.Projects.Count > 0)
            { 
                string solutionPath = solution.FullName;
            }

Любой альтернативный подход для создания артефакта сборки для выбранного проекта?

Пожалуйста, обратитесь к следующему коду, который получит специальный проект и соберите его.

пожалуйста, добавьте ссылку: используя Microsoft.Build.Construction;

используя Microsoft.Build.Evaluation;

используя Microsoft.Build.Framework;

string solutionPath = "yousolutionPath.sln";
                var solutionFile = SolutionFile.Parse(solutionPath);
                foreach (var item in solutionFile.ProjectsInOrder)
                {
                    Project project = ProjectCollection.GlobalProjectCollection.LoadProject(item.AbsolutePath);
                    project.SetGlobalProperty("Configuration", "Debug");
                    if (project.GetPropertyValue("RootNamespace") == "CppApp5")
                    {
                        project.Build("Build");
                    }
         }

Как сказал Джейсон, вы можете получить currentSoution через следующий код.

 var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
 var workspace = componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
 Microsoft.CodeAnalysis.Solution sln = workspace.CurrentSolution;