如何使用Microsoft.CodeAnalysis打开当前的Visual Studio解决方案
问题描述:
我正在开发用于代码分析的Visual Studio扩展,扩展需要为用户选择的项目发出dll,我选择了Microsoft.CodeAnalysis库以为选定的项目发出构建工件项目。如何使用Microsoft.CodeAnalysis打开当前的Visual Studio解决方案
我无法找到一种方法来打开当前的解决方案,但没有指定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
//
}
答
如何获取当前SLN路径?
你可以通过Dte.Solution.FullName方法目前SLN,像这样:
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添加引用: ;
using Microsoft.Build.Evaluation;
using 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");
}
}
正如Jason所说,您可以通过以下代码获取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;
答
如果你想获得当前打开的项目,你应该不使用MSBuildWorkspace工作区。相反,MEF导入VisualStudioWorkspace。这是保持现场和最新与用户正在编辑的代码。有关更多详情,请参阅this one之类的问题。
感谢您的重播,您能否解释如何初始化类库中的“ServiceProvider”对象?有没有办法通过Workspace API和这方面的任何例子来做到这一点? – Bandara
如果他们试图在Visual Studio中使用它,他们不应该使用MSBuildWorkspace。 –
它是一个vsix项目,你能得到当前的visual studio DTE实例吗? –