是否可以仅在Roslyn中编译更改?

时间:2019-09-27 01:22:07

标签: 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 (PreviouslyAddedAndHasChanges(tree)) {
      compiler = compiler.ReplaceSyntaxTree(oldTree, tree);
  }
  else if (NewlyAdded(tree)) {
      compiler = compiler.AddSyntaxTree(tree);
  }
}

compiler.Emit(...);

但是它不起作用。输出程序集将不会更改。 我也看一下EmitDifference方法,但是它不适用于.dll输出。

这是我的问题:

  1. 像我的第一行代码一样,重用CSharpCompilation对象是否安全?
  2. Roslyn是否缓存以前的编译数据,我应该使它无效吗?

1 个答案:

答案 0 :(得分:1)

自我回答: 我现在修复了。该问题与Assembly.Load()无关。 这两个程序集具有完全相同的名称,因此compiler = compiler.WithAssemblyName("some_name" + (new System.Random()).Next(10000000)); 根本不起作用。

这是我的解决方案。

/page/XXX: return rendered html to web browser, 
/api/XXX:  return JSON(just data) to ios/android render a native page based on the JSON

而且,答案是:

  1. 我不确定,但是如果有任何更改,他们似乎会重新编译它。