この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());
その後、ループが終了するまでこの例外を出し続けます。タスク マネージャーからダンプ ファイルを作成しましたが、ダンプ ファイルのサイズがほぼ 500 MB に達しました。WinDbg を使用してダンプ ファイルをデバッグしましたが、 WinDbgのエキスパート ユーザーではないため、問題を解決でき ませんでした。メモリリークの問題かどうかはわかりません。メモリがによって解放されていませんStringBuilder
。
創造
AppDomain
することで問題は解決するでしょうか?StringWriter
の代わりに使用しStringBuilder
ますか?
どんな提案や助けも大歓迎です。