C# 是否可以只编译Roslyn中的更改?

C# 是否可以只编译Roslyn中的更改?,c#,roslyn,C#,Roslyn,我用Roslyn做了一个C编译程序。然而,编译整个项目大约需要1秒的时间 我正在尝试优化时间,以下是我的尝试: // I'm currently recycling the compilation object. if (compiler == null) compiler = CreateCompiler(); /* ... */ for (var tree in syntaxTrees) { SyntaxTree oldTree; if (PreviouslyAdded

我用Roslyn做了一个C编译程序。然而,编译整个项目大约需要1秒的时间

我正在尝试优化时间,以下是我的尝试:

// I'm currently recycling the compilation object.
if (compiler == null)
    compiler = CreateCompiler();

/* ... */

for (var tree in syntaxTrees) {
  SyntaxTree oldTree;

  if (PreviouslyAddedAndHasChanges(tree)) {
      compiler = compiler.ReplaceSyntaxTree(oldTree, tree);
  }
  else if (NewlyAdded(tree)) {
      compiler = compiler.AddSyntaxTree(tree);
  }
}

compiler.Emit(...);
但它不起作用。不会更改输出程序集。 我还查看了EmitDifference方法,但它不适用于.dll输出

我的问题是:

像我的第一行代码一样重复使用CSharpCompilation对象安全吗? Roslyn是否缓存以前的编译数据?我是否应该使其无效? 自我回答: 我现在修好了。这个问题与罗斯林无关。 这两个程序集的名称完全相同,因此Assembly.Load根本不起作用

这是我的解决方案

compiler = compiler.WithAssemblyName("some_name" + (new System.Random()).Next(10000000));
答案是:

对 我不确定,但如果有任何变化,他们似乎会重新编译它。
msbuild/C确实有,但不确定如何将其传递到Roslyn。您应该能够像在这里所做的那样添加和替换树。Emit将返回EmitResult。它说它成功了吗?@JoshVarty是的,没有错误。可能以前添加的和现在添加的都是错误的吗?您没有其他选项,因此默认情况下将使用旧编译。在两次运行之间,请尝试从磁盘中删除.dll,以确保它正确发出。实际上,我使用MemorySteram发出并加载.dll。因此,无法删除以前的.dll。然而,我从你的评论中得到了一个暗示。问题是程序集。加载不起作用,因为两个程序集的名称完全相同。