我正在使用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
}
问题是解决方案变量不包含文件在本地不可用的项目。这意味着无法加载项目,因为文件丢失了。
有没有办法获取所有项目引用,包括缺少项目文件的引用?
答案 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;