' 入門から初級の方は見送るのを推奨 ' 今回は珍しくコンソールアプリケーションです。 ' Module1の他にCHogeクラスを作成する必要があります。 Imports System Imports System.Reflection Imports System.Reflection.Emit Module Module1 Sub Main(ByVal args As String()) ' ■dmコンストラクターの説明 ' 第1:Null不可。好きな名称でOK ' # 今回はふざけてますが、~Addなどわかりやすい名称がいいと思います。 ' 第2:メソッドの戻り値 ' 第3:メソッドの引数 ' 第4:扱うクラス ' 第5:Jitの参照範囲のチェック(trueだと省略) Dim dm As New DynamicMethod( _ "HogetyauYo!", _ GetType(Integer), _ New Type() {GetType(Integer), GetType(Integer)}, _ GetType(CHoge), _ False) ' メソッド一覧の情報を取得 Dim mi As MethodInfo = GetType(CHoge).GetMethod("MyAdd", BindingFlags.Static Or BindingFlags.Public) ' メタデータ生成の代替 Dim info As DynamicILInfo = dm.GetDynamicILInfo() info.SetCode(mi.GetMethodBody().GetILAsByteArray(), 10) 'TODO: レイアウトで使う値がよくわからない。 ' 0x07(BEL???) BELを指す??? それだと、意味が通じないような。 ' 0x02(STX???) テクスト開始? ' 0x08(IP) インストラクションポインタ(アセンブルの開始と終了?) info.SetLocalSignature(New Byte() {&H7, &H2, &H8, &H8}) Dim iA As Integer = 5 Dim iB As Integer = 2 Console.WriteLine("{0} + {1} = {2}", iA, iB, dm.Invoke(Nothing, New Object() {iA, iB})) Console.ReadLine() End Sub End Module
Public Class CHoge Shared Function MyAdd(ByVal iA As Integer, ByVal iB As Integer) As Integer Return iA + iB End Function End Class