可能重复:
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
释放。
创建AppDomain
会解决问题吗?
我应该使用StringWriter
代替StringBuilder
吗?
任何建议或帮助将不胜感激。