Roslyn:向项目添加文档

8

我正在运行Roslyn CTP2

我正在尝试向项目中添加一个新的HTML文件

IWorkspace workspace = Workspace.LoadSolution("MySolution.sln");
var originalSolution = workspace.CurrentSolution;
ISolution newSolution = originalSolution;
newSolution.GetProject(newSolution.ProjectIds.First())
                        .AddDocument("index.html", "<html></html>");
workspace.ApplyChanges(originalSolution, newSolution);

这意味着没有任何更改被写入。我正在尝试让新的HTML文件出现在VS中。


大多数Roslyn中的对象都是不可变的,因此我认为您需要使用AddDocument()返回的项目。但我不确定如何做到这一点,而不删除旧项目,并将新项目添加回去。 - svick
2个回答

6
这里有两个问题:
  1. Roslyn的ISolutionIProjectIDocument对象是不可变的,所以要看到更改,需要创建一个带有更改的新ISolution,然后调用Workspace.ApplyChanges()
  2. 在Roslyn中,只有传递给编译器的文件才会创建IDocument对象。换句话说,也就是在项目文件的Compile ItemGroup中包含的内容。对于其他文件(包括HTML文件),应使用正常的Visual Studio界面,如IVsSolution

5

工作区是不可变的。这意味着任何听起来像要“修改”工作区的方法都将返回一个应用了更改的新实例,而不是修改原有实例。

因此,您需要类似以下的内容:

IWorkspace workspace = Workspace.LoadSolution("MySolution.sln");
var originalSolution = workspace.CurrentSolution;
var project = originalSolution.GetProject(originalSolution.ProjectIds.First());
IDocument doc = project.AddDocument("index.html", "<html></html>");
workspace.ApplyChanges(originalSolution, doc.Project.Solution);

然而,我现在不在安装了Roslyn的计算机附近,所以无法百分之百地保证这一点。


3
工作空间本身是会变化的,它在改变时会发出事件,但几乎所有其他事物都是不可变的。解决方案、项目和文档对象是不可变的,并且存在于一个层次结构中。当您添加文档来更改项目时,您将得到一个新的项目实例,它是新解决方案实例的成员。在将更改应用回工作空间时,您需要使用新的解决方案实例,否则您将看不到工作空间中的更改。 - Matt Warren

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