C#Eval函数中的内存不足异常

时间:2012-06-10 00:55:00

标签: c#

  

可能重复:
  How can I prevent CompileAssemblyFromSource from leaking memory?

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

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函数几乎(如上所述)运行数千次,在每个循环中对其进行表达式求值。 但是一旦循环值达到4000就会给我

System.OutOfMemoryException occured in System.dll

超过这条线

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

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

  1. 创建AppDomain会解决问题吗?

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

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

0 个答案:

没有答案