Можно ли скомпилировать только изменения в Roslyn? - PullRequest
0 голосов
/ 27 сентября 2019

Я сделал программу компиляции C # с Roslyn.Однако компиляция всего проекта занимает около 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 output.

Вот мой вопрос:

  1. Безопасно ли повторно использовать CSharpCompilationобъект, как моя первая строка кода?
  2. Кэширует ли Roslyn предыдущие данные компиляции и должен ли я их аннулировать?

1 Ответ

1 голос
/ 27 сентября 2019

Самостоятельный ответ: я исправил это сейчас.Проблема не была связана с Roslyn.Две сборки имеют одно и то же имя, поэтому Assembly.Load() вообще не работает.

Вот мое решение, чтобы это исправить.

compiler = compiler.WithAssemblyName("some_name" + (new System.Random()).Next(10000000));

И ответы таковы:

  1. Да
  2. Я не уверен, но кажется, что они перекомпилируют его, если есть какие-либо изменения.
...