【发布时间】:2026-02-16 13:50:01
【问题描述】:
我在使用 roslyn ScriptingAPI 抛出异常说:
内存不足,无法继续执行程序
在编译多个字符串脚本时,一个一个,像这样:
foreach (string script in scripts)
{
var evalFunc = CSharpScript.Create(script, roslynOptions, typeof(ParamsVM));
evalFunc.Compile();
cachedScripts.Add(rule.Formula,evalFunc);
}
我以为我可以保存所有已编译的脚本,以便以后在数千个数据项上使用它们,但由于这种保存,内存达到了 ~4GB。
如果我在需要的时候使用了每个脚本(稍后当我迭代数据项时),那么每个脚本将被一次又一次地编译。
这种用例的解决方案是什么?
【问题讨论】:
-
不能只缓存最常用的吗?
-
所有脚本都用在我拥有的所有数据集上
-
@BugFinder :我怀疑除非加载到不同的应用程序域,否则不可能抛弃此进程创建的“内存中 DLL”。当 appdomain 加载代码时,这是一个单向过程。不过,您可以卸载 appdomains...此时,最好采用 MEF 之类的东西来完成工作。
-
您可以只保存已编译的代码,让 GC 只保留来自 script.CreateDelegate() 的委托来回收所有编译时工件。
-
this question 的可能重复项。