我正在研究在Visual Studio扩展(VSIX)中使用Roslyn编译器,它使用VisualStudioWorkspace
来更新现有代码。
想象一下,我目前的解决方案有12个项目。对于我想要的每个项目:
我理解这些对象的不变性,作为一个概念验证,我写了一个例子,对第一个项目进行了更改,然后是第二个项目等等。
然后我想知道是否可以使用异步任务对每个项目进行更改,并且当所有任务都已完成(所有项目都已更新)时,更新解决方案。
为此,我已经改变了我的概念验证,而且我正处于现在有12个更新项目的阶段。我不清楚的是如何将所有更改合并到我当前的解决方案中,以便我可以一步调用myWorkspace.TryApplyChanges(sln)
。
答案 0 :(得分:0)
是的,这应该可以正常工作。当您完成对第一个项目的重写时,您可以执行.Solution,并为您提供重写的新解决方案。然后,去那里重写第二个项目。这是一个Solution.ProjectIds集合,它为您提供了不从快照更改为快照的ID列表。
var originalSolution = ...;
var rewrittenSolution = originalSolution;
foreach (var projectId in originalSolution.ProjectIds)
{
var projectToRewrite = rewrittenSolution.GetProject(projectId);
// update projectToRewrite here
rewrittenSolution = projectToRewrite.Solution;
}
workspace.TryApplyChanges(rewrittenSolution);