投稿者 葉月  (社会人) 投稿日時 2010/5/16 17:15:57
こんにちは。

関係ないかも知れませんが、
このスレにある「あにすさん」のサンプルは参考になりませんか?
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=140

>読んで理解するのは難しそうですので、諦めようと思います。。
このまま終わらすのは、もったいない内容だと思いますが……
スレが終わりそうだったので、関連するクラスのMSDNを読みました。
MSDNを読んでみて、正直、私は宇宙人が翻訳してるんじゃないかと思いました(笑)
だから、諦めたくなる気持ちもわかります。
でも、短いサンプルを掲載して不明点を聞いた方が、長い目で見れば建設的ですよ。
業務では見送るにしても、知識として持っておくにはいいと思いましたので。

>一通り目を通したMSDNの記事
http://msdn.microsoft.com/ja-jp/library/system.reflection.emit.dynamicilinfo.aspx
http://msdn.microsoft.com/ja-jp/library/system.reflection.emit.ilgenerator.aspx
http://msdn.microsoft.com/ja-jp/library/3f4t3ddz.aspx
http://msdn.microsoft.com/ja-jp/library/xc6e708b%28v=VS.90%29.aspx


>>サンプル
>Module1.VB
' 入門から初級の方は見送るのを推奨 
' 今回は珍しくコンソールアプリケーションです。 
' 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(NothingNew Object() {iA, iB}))
        Console.ReadLine()
    End Sub
End Module


>CHoge.VB
Public Class CHoge
    Shared Function MyAdd(ByVal iA As IntegerByVal iB As IntegerAs Integer
        Return iA + iB
    End Function
End Class