Roslyn获取所有解决方案项目的引用。

4

我正在使用Roslyn读取像这样的解决方案的引用项目:

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
workspace.LoadMetadataForReferencedProjects = true;
Solution solution = workspace.OpenSolutionAsync(Solution).Result;
foreach (var p in solution.Projects) {
   //do something with the project
}

问题在于解决方案变量不包含文件在本地不可用的项目。这意味着由于文件丢失而无法加载该项目。

是否有一种方法可以获取所有项目引用,包括其中项目文件丢失的引用?

1个回答

7

有一种方法可以加载在sln文件中配置的所有项目。但是,这不是通过roslyn实现的。

Microsoft Build公开了Microsoft.Build.Construction.SolutionFile

您可以通过多种方式获取项目,例如:

SolutionFile solutionInfo = SolutionFile.Parse(@"/path-to-sln.sln");
IEnumerable<ProjectInSolution> projectList = solutionInfo.ProjectsInOrder;

您可以使用workspace.OpenProjectAsync(project.AbsolutePath)来加载可用项目。 (请注意,workspace是一个MSBuildWorkspace,而project是一个ProjectInSolution)。

实际上,这正是Roslyn通过MSBuildProjectLoader在幕后执行的操作。 但是,它仅支持处理缺少项目的两种行为:记录或抛出异常。 如果您希望对缺少的项目抛出异常,请设置workspace.SkipUnrecognizedProjects = false;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接