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

doo*_*man 4 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
}
Run Code Online (Sandbox Code Playgroud)

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

有没有办法获取所有项目引用,包括缺少项目文件的引用?

far*_*121 7

有一种方法可以加载在 sln 文件中配置的所有项目。然而,它不是通过roslyn。

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

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

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

从这里你可以workspace.OpenProjectAsync(project.AbsolutePath)用来加载可用的项目。(注意,workspace 是 aMSBuildWorkspace并且 project 是 a ProjectInSolution)。

这实际上是 roslyn 通过MSBuildProjectLoader在幕后所做的事情。但是,它仅支持两种处理缺失项目的行为:记录或抛出异常。如果您宁愿为丢失的项目抛出异常,请设置workspace.SkipUnrecognizedProjects = false;