1

我正在开发一个用于代码分析的 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
    //
}
4

2 回答 2

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");
                    }
         }

正如 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;
于 2017-02-15T08:56:52.483 回答
1

如果您尝试获取当前打开项目的工作区,则不应使用MSBuildWorkspace。相反,MEF 导入 VisualStudioWorkspace。这与用户正在编辑的代码保持实时和最新。有关更多详细信息,请参阅类似这样的问题。

于 2017-02-15T18:42:49.813 回答