我与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
是否缓存以前的编译数据,我应该使它无效吗?答案 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
而且,答案是: