如何使用Microsoft.CodeAnalysis打开当前的Visual Studio解决方案

时间:2017-02-15 08:04:01

标签: visual-studio visual-studio-2015 visual-studio-extensions roslyn-code-analysis 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 个答案:

答案 0 :(得分:1)

如果您正在尝试获取当前打开项目的工作区,则使用MSBuildWorkspace。相反,MEF导入VisualStudioWorkspace。这与用户正在编辑的代码保持同步并保持最新。有关详细信息,请参阅this one等问题。

答案 1 :(得分:-1)

  

如何获得当前的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;

使用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;