Roslyn将文档添加到项目中

Dan*_*ack 8 c# roslyn

我正在运行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);
Run Code Online (Sandbox Code Playgroud)

这导致没有写入任何更改.我想让新的html文件出现在VS中

Kev*_*lch 6

这里有两个问题:

  1. Roslyn ISolution,IProjectIDocument对象是不可变的,因此为了查看更改,您需要ISolution使用更改创建新的,然后调用Workspace.ApplyChanges().
  2. 在Roslyn中,IDocument仅为传递给编译器的文件创建对象.另一种说法是Compile ItemGroup项目文件中的一部分.对于其他文件(包括html文件),您应该使用正常的Visual Studio接口IVsSolution.


Dam*_*ver 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);
Run Code Online (Sandbox Code Playgroud)

然而,我目前不在安装 Roslyn 的机器附近,所以我不能 100% 保证这一点。

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