2012-09-11 105 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

它不是不可變的工作空間,而是其他所有的工作空間。工作區本身發生變化,在事件發生變化時觸發事件。解決方案,項目和文檔對象是不可變的,它們存在於一個層次結構中。當您通過添加文檔來更改項目時,會得到一個新的項目實例,它是新解決方案實例的成員。當您將更改應用回工作區或者您不會在工作區中看到更改時,您需要使用新的解決方案實例。 –