【问题标题】:Roslyn Scripting API throws Insufficient memory to continue the execution of the programRoslyn Scripting API 抛出 Insufficient memory to continue the execution of the program
【发布时间】: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 的可能重复项。

标签: c# roslyn


【解决方案1】:

我摆脱了使用Roslyn Scripting API 来评估我的脚本的想法。
我开始使用Microsoft.CSharp.CSharpCodeProvider,我迭代了所有脚本并形成(作为字符串)一个完整的类(及其所有using部分和namespace)然后我编译它(将其视为缓存)所以在那之后我可以通过反映我已经编译的程序集来动态调用方法,并将它需要的参数传递给它。

【讨论】: