Как открыть текущее решение 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;