Visual studio 如何使用Microsoft.CodeAnalysis打开当前的Visual Studio解决方案
我正在开发用于代码分析的Visual Studio扩展,该扩展需要为用户选择的项目发出dll,我已选择Microsoft.CodeAnalysis库为所选项目发出生成工件 如果不指定sln文件的路径(添加了示例代码),我无法找到打开当前解决方案的方法,如何获取当前sln路径?为所选项目生成构建工件的任何替代方法 编辑: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
我的用例:用户打开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文件的项目,并将构建工件放置在文件夹中。