2012-09-11 66 views
8

我跑罗斯林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

+0

Roslyn中的大多数对象是不可变的,所以我认为你需要使用'AddDocument()'返回的项目。但我不知道如何去做,而不需要删除旧项目,然后再添加新项目。 – svick

回答

6

这里有两个问题:

  1. 罗斯林ISolutionIProject,并IDocument对象是不可改变的,因此要想看到改变,你需要创建一个新的ISolution与变化,然后调用Workspace.ApplyChanges()
  2. 在Roslyn中,IDocument只为传递给编译器的文件创建对象。说这个的另一种方式是项目文件中CompileItemGroup的一部分。对于其他文件(包括html文件),您应该使用普通的Visual Studio界面,如IVsSolution
4

工作区是不可变的。这意味着任何听起来像是要去修改工作空间的方法将返回一个新的实例与应用的更改。

所以,你想是这样的:

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); 

不过,我不是罗斯林安装在此刻机器附近,所以我不能保证这100%。

+3

它不是不可变的工作空间,而是其他所有的工作空间。工作区本身发生变化,在事件发生变化时触发事件。解决方案,项目和文档对象是不可变的,它们存在于一个层次结构中。当您通过添加文档来更改项目时,会得到一个新的项目实例,它是新解决方案实例的成员。当您将更改应用回工作区或者您不会在工作区中看到更改时,您需要使用新的解决方案实例。 –