我正在使用这个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
.
创造
AppDomain
能解决问题吗?我应该使用
StringWriter
代替StringBuilder
吗?
任何建议或帮助将不胜感激。