如何使用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; 
+0

感谢您的重播,您能否解释如何初始化类库中的“ServiceProvider”对象?有没有办法通过Workspace API和这方面的任何例子来做到这一点? – Bandara

+1

如果他们试图在Visual Studio中使用它,他们不应该使用MSBuildWorkspace。 –

+0

它是一个vsix项目,你能得到当前的visual studio DTE实例吗? –

如果你想获得当前打开的项目,你应该使用MSBuildWorkspace工作区。相反,MEF导入VisualStudioWorkspace。这是保持现场和最新与用户正在编辑的代码。有关更多详情,请参阅this one之类的问题。