0

可能重复:
如何防止 CompileAssemblyFromSource 泄漏内存?

我正在使用这个http://www.codeproject.com/Articles/11939/Evaluate-C-Code-Eval-Function示例来评估 ac# 表达式,该表达式将被评估数千次。

public static object Eval(string sCSCode) {
    CSharpCodeProvider c = new CSharpCodeProvider();
    ICodeCompiler icc = c.CreateCompiler();
    CompilerParameters cp = new CompilerParameters();

    cp.ReferencedAssemblies.Add("system.dll");
    cp.ReferencedAssemblies.Add("system.data.dll");

    StringBuilder sb = new StringBuilder("");
    sb.Append("using System;\n" );
    sb.Append("using System.Data;\n");
    sb.Append("namespace CSCodeEvaler{ \n");
    sb.Append("public class CSCodeEvaler{ \n");
    sb.Append("public object EvalCode(){\n");
    sb.Append("return "+sCSCode+"; \n");
    sb.Append("} \n");
    sb.Append("} \n");
    sb.Append("} \n");

    CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString());

    if( cr.Errors.Count > 0 ){
        MessageBox.Show("ERROR: " + cr.Errors[0].ErrorText, "Error evaluating cs code", MessageBoxButtons.OK, MessageBoxIcon.Error );
        return null;
    }

    System.Reflection.Assembly a = cr.CompiledAssembly;
    object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");

    Type t = o.GetType();
    MethodInfo mi = t.GetMethod("EvalCode");

    object s = mi.Invoke(o, null);
    return s;
}

Eval 函数几乎(如上所述)运行数千次,以在 for each 循环中执行其表达式评估。但是一旦循环值达到 4000 它给了我

System.OutOfMemoryException occured in System.dll

越过这条线

CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString());

然后它一直给出这个异常,直到循环结束。我从任务管理器创建了一个转储文件,转储文件大小达到近 500MB,我使用WinDbg调试了转储文件但无法解决问题,因为我不是WinDbg的专家用户 所以无法弄清楚它为什么会发生?我不确定它的内存泄漏问题,内存没有被StringBuilder.

  1. 创造AppDomain能解决问题吗?

  2. 我应该使用StringWriter代替StringBuilder吗?

任何建议或帮助将不胜感激。

4

0 回答 0