Dim fn As Func(Of Integer, Integer, Integer) = AddressOf CHoge.MyAdd Dim ret As Integer = fn(iA, iB)
Dim mi As MethodInfo = GetType(CHoge).GetMethod("MyAdd", BindingFlags.Static Or BindingFlags.Public) ret = CInt(mi.Invoke(Nothing, New Object() {iA, iB}))
00 : OpCodes.Nop (nop : 何もしない) 02 : OpCodes.Ldarg_0 (ldarg.0 : 引数#0を stack にロード) 03 : OpCodes.Ldarg_1 (ldarg.1 : 引数#1を stack にロード) D6 : OpCodes.Add_Ovf (add.ovf : stack から値を2つ取り出し、加算結果をstack に入れる) 0A : OpCodes.Stloc_0 (stloc.0 : stack から値を1つ取り出し、インデックス#0の変数に移動) 2B : OpCodes.Br_S (br.s : <int8> で指定されたオフセットの位置に無条件ジャンプする) 00 : オフセット 0x00 06 : OpCodes.Ldloc_0 (ldloc.0 : インデックス#0の変数を stack にロード) 2A : OpCodes.Ret (ret : stack から値を1つ取り出し、それを戻り値としてメソッドから戻る)
Dim dm As New DynamicMethod( _ "HogetyauYo!", _ GetType(Integer), _ New Type() {GetType(Integer), GetType(Integer)}, _ GetType(CHoge), _ False) Dim info As DynamicILInfo = dm.GetDynamicILInfo() info.SetCode(New Byte() {&H2, &H3, &HD6, &H2A}, 2) info.SetLocalSignature(New Byte() {&H7, 0}) Dim iA As Integer = 5 Dim iB As Integer = 2 Dim ret As Integer = CInt(dm.Invoke(Nothing, New Object() {iA, iB}))
Dim dm As New DynamicMethod( _ "MyAdd", _ GetType(Integer), _ New Type() {GetType(Integer), GetType(Integer)}) Dim g As ILGenerator = dm.GetILGenerator() g.Emit(OpCodes.Ldarg_0) '02: 引数#0の読み込み g.Emit(OpCodes.Ldarg_1) '03: 引数#1の読み込み g.Emit(OpCodes.Add_Ovf) 'D6: 加算 g.Emit(OpCodes.Ret) '2A: Return Dim iA As Integer = 5 Dim iB As Integer = 2 Dim ret As Integer = CInt(dm.Invoke(Nothing, New Object() {iA, iB}))
Dim g As ILGenerator = dm.GetILGenerator() g.DeclareLocal(GetType(Integer)) 'ローカル変数。強いて言えば「Dim MyAdd As Integer」に相当。 g.Emit(OpCodes.Nop) '00: 何もしない g.Emit(OpCodes.Ldarg_0) '02: 引数#0の読み込み g.Emit(OpCodes.Ldarg_1) '03: 引数#1の読み込み g.Emit(OpCodes.Add_Ovf) 'D6: 加算 g.Emit(OpCodes.Stloc_0) '0A: 変数#0に代入 g.Emit(OpCodes.Br_S, CByte(0)) '2B,00: 次の行へジャンプ g.Emit(OpCodes.Ldloc_0) '06: 変数#1を読み込み g.Emit(OpCodes.Ret) '2A: Return