C# 是否可以只编译Roslyn中的更改?
我用Roslyn做了一个C编译程序。然而,编译整个项目大约需要1秒的时间 我正在尝试优化时间,以下是我的尝试: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
// 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。然而,我从你的评论中得到了一个暗示。问题是程序集。加载不起作用,因为两个程序集的名称完全相同。