Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何使用Microsoft.CodeAnalysis打开当前的Visual Studio解决方案_Visual Studio_Visual Studio 2015_Visual Studio Extensions_Roslyn Code Analysis_Microsoft.codeanalysis - Fatal编程技术网

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

Visual studio 如何使用Microsoft.CodeAnalysis打开当前的Visual Studio解决方案,visual-studio,visual-studio-2015,visual-studio-extensions,roslyn-code-analysis,microsoft.codeanalysis,Visual Studio,Visual Studio 2015,Visual Studio Extensions,Roslyn Code Analysis,Microsoft.codeanalysis,我正在开发用于代码分析的Visual Studio扩展,该扩展需要为用户选择的项目发出dll,我已选择Microsoft.CodeAnalysis库为所选项目发出生成工件 如果不指定sln文件的路径(添加了示例代码),我无法找到打开当前解决方案的方法,如何获取当前sln路径?为所选项目生成构建工件的任何替代方法 编辑: 我的用例:用户打开VSIDE->打开一个.cs文件->他选择“分析”选项,该选项将从我的扩展中添加->然后扩展应该编译包含用户打开的.cs文件的项目 using Microsof

我正在开发用于代码分析的Visual Studio扩展,该扩展需要为用户选择的项目发出dll,我已选择Microsoft.CodeAnalysis库为所选项目发出生成工件

如果不指定sln文件的路径(添加了示例代码),我无法找到打开当前解决方案的方法,如何获取当前sln路径?为所选项目生成构建工件的任何替代方法

编辑:
我的用例:用户打开VSIDE->打开一个.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

使用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;
var componentModel=(icomonentmodel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(scocomponentmodel));
var workspace=componentModel.GetService();
Microsoft.CodeAnalysis.Solution sln=workspace.CurrentSolution;

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

感谢重播,您能否解释如何初始化类库中的“ServiceProvider”对象?有没有一种方法可以通过工作区API和任何相关示例来实现这一点?如果他们试图在Visual Studio中使用此方法,他们不应该使用MSBuildWorkspace。这是一个vsix项目,您可以获取当前的Visual Studio DTE实例吗?@Cole Wu MSFT没有,它不是一个vsix项目,它是一个类库。我的用例:用户打开VS IDE->打开一个.cs文件->他选择“Analyze”选项,该选项将从我的扩展中添加->然后扩展应该编译包含用户打开的.cs文件的项目,并将构建工件放置在文件夹中。