DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#で変数の中身を実行する

分類:[.NET]

とてもわかりにくいのですが、C#で変数の中身を実行するにはどうすればいいのでしょうか。
例えば、

//-------------------------
string A,i;
A = "19+7*3";
i = //Aを実行した答え;
MessageBox.Show (i);
//-------------------------

を実行すると、40と書かれたメッセージボックスが表示されるということです。
こんなことはできないのでしょうか?
よろしくお願いします。
> とてもわかりにくいのですが、C#で変数の中身を実行するにはどうすればいいのでしょうか。

using System.CodeDom.Compiler;

    //-------+---------+---------+---------*---------+---------+---------+
    // 記述された数式を計算する (少々難有)
    //-------+---------+---------+---------*---------+---------+---------+
    private static string DynamicCalc(string expression) {
      //ソースコードを生成
      string source = "using System;"
                    + "public class CalcClass {"
                    + "  public static double Calc() {"
                    + "    return %ReplacePart%;"
                    + "  }"
                    + "}";
      source = source.Replace("%ReplacePart%", expression);

      //InMemoryコンパイル
      CompilerParameters cparam = new CompilerParameters();
      cparam.ReferencedAssemblies.Add("System.dll");
      cparam.GenerateInMemory = true;
      CompilerResults cresult = new CSharpCodeProvider().
        CreateCompiler().CompileAssemblyFromSource(cparam, source);

      //アセンブリを呼び出して結果を取得
      Type t = cresult.CompiledAssembly.GetType("CalcClass");
      return ((double)t.GetMethod("Calc").Invoke(null, null)).ToString();
    }

とすれば、それなりに計算できますが(Math.Sqrt()とかも書ける)、
ヘッダにあるとおり少々難有です。(^^;

・小数点で欲しいところは、ちゃんと 10/3d とかする必要あり
・メモリに毎回アセンブリが読み込まれるので、
  いつかOutOfMemoryになる可能性大。

後者はAppDomainを分ければ対処可能かも。

個人的には、DBを用意してSQLで投げてしまうのが手軽でいいと思う。
■No507に返信(ピラルクさんの記事)
> > とてもわかりにくいのですが、C#で変数の中身を実行するにはどうすればいいのでしょうか。

あまり変わらないかもしれませんが、Microsoft Script Controlを使う手もありますね。

MSScriptControl.ScriptControl sc =
new MSScriptControl.ScriptControl();
sc.Language = "vbscript";
Console.WriteLine(sc.Eval("19+7*3"));
勝手にDoubleになるし、この場合は絶対こっち(eval)がいいと思われます。

ただ、msscript.ocxは、IEにつられてUpdateされるのかな?
だとしたら、Versionも注意がいるかも。(計算程度では差は出ないと思うけど)

# VBScriptにもeval()があったのか……
# 最近知ったところでは、XMLを通すことによって、
# Language = C#
# でも動的コード実行ができるみたい。

DOBON.NET | プログラミング道 | プログラミング掲示板