【问题标题】:Roslyn Add a document to a projectRoslyn 将文档添加到项目
【发布时间】:2012-09-11 10:43:59
【问题描述】:

我正在运行 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() 返回的项目。但我不知道该怎么做,不删除旧项目然后添加新项目。

标签: c# roslyn


【解决方案1】:

这里有两个问题:

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

【讨论】:

    【解决方案2】:

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

    所以你想要这样的东西:

    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 的机器附近,所以我不能保证 100%。

    【讨论】:

    • 不可变的不是工作区,而是其他所有东西。工作区本身会发生变化,并在发生变化时触发事件。解决方案、项目和文档对象是不可变的,它们存在于层次结构中。当您通过添加文档来更改项目时,您会得到一个新的项目实例,它是新解决方案实例的成员。当您将更改应用回工作区时,您需要使用新的解决方案实例,否则您将看不到工作区中的更改。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多