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 */
あと、これを調べるのにここを参考にしたこともメモっておかないと。