我正在开发用于代码分析的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
//
}
答案 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;