Roslyn获得所有解决方案项目参考

时间:2018-04-14 18:21:42

标签: c# roslyn

我正在使用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 个答案:

答案 0 :(得分:3)

有一种方法可以加载在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)加载可用项目。 (注意,工作空间是MSBuildWorkspace,项目是ProjectInSolution)。

这实际上是罗斯林通过MSBuildProjectLoader在幕后做的事情。但是,它仅支持两种处理缺失项目的行为:log or throw exception。如果您希望为缺少的项目抛出异常,请设置workspace.SkipUnrecognizedProjects = false;