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());

その後、ループが終了するまでこの例外を出し続けます。タスク マネージャーからダンプ ファイルを作成しましたが、ダンプ ファイルのサイズがほぼ 500 MB に達しました。WinDbg を使用してダンプ ファイルをデバッグしましたが、 WinDbgのエキスパート ユーザーではないため、問題を解決でき ませんでした。メモリリークの問題かどうかはわかりません。メモリがによって解放されていませんStringBuilder

  1. 創造AppDomainすることで問題は解決するでしょうか?

  2. StringWriterの代わりに使用しStringBuilderますか?

どんな提案や助けも大歓迎です。

4

0 に答える 0