ILバイトコード再び?(復刻版)

日記を上書きして潰してしまいました。はてなにアップしたソースは削除しているので手元にソースコードすら無い状態なので、かなりショック。なんとか記憶から引っ張り出してソースだけは復元しました。取りあえず、これで許して・・・

確か、こんな感じで始まっていた気が。
http://d.hatena.ne.jp/akiramei/20040714#p1で、

実行時にILコードを持ってこれるのは良いのですが、それを扱うクラスが用意されていないのは辛いですね。

こんなこと言ってしましたが、一応、用意されているみたいです。

using System;
using System.Reflection;
using System.Reflection.Emit;

class Program
{
    static int Add(int a, int b)
    {
        return a + b;
    }

    static void Main(string args)
    {
        DynamicMethod dm = new DynamicMethod("DynamicAdd", 
            typeof(int), new Type { typeof(int), typeof(int) }, typeof(Program), false);
        MethodInfo mi = typeof(Program).GetMethod("Add", 
            BindingFlags.Static | BindingFlags.NonPublic);

        DynamicILInfo dii = dm.GetDynamicILInfo();
        dii.SetCode(mi.GetMethodBody().GetILAsByteArray(), 10);
        dii.SetLocalSignature(new byte { 0x07, 0x02, 0x08, 0x08 });

        int a = 5;
        int b = 10;
        Console.WriteLine("{0} + {1} = {2}", a, b, dm.Invoke(null, new object { a, b }));
        Console.ReadLine();
    }
}
/* 結果
5 + 10 = 15 */

あと、これを調べるのにここを参考にしたこともメモっておかないと。