投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/17 13:51:15
むぅ。[関連URLなど]のボックスは、複数行書けるようになっているのに、
実際には 1 つしか書けないのですね…。削除して再訂正します。
http://www.ecma-international.org/publications/standards/Ecma-335.htm
http://msdn.microsoft.com/ja-jp/library/3f4t3ddz.aspx 

# 本文を削除したら、URL も削除されるべきなのでは? >るきおさん


で、本題。

> 'TODO: レイアウトで使う値がよくわからない。 
このバイナリは、LocalVarSig と呼ばれており、
              ┌──────────────────────────────────────┐
              │ ┌─────────────────────┐              │
 ┏━━━━━┓ ┏━━━┓↓ ↓  ┏━━━━━┓    ┏━━━━━┓ │  ┏━━━┓  ┏━━┓ │
→┃LOCAL_SIG ┠→┃Count ┠─┬─┬→┃CustomMod ┠─┬─→┃Constraint┠─┴┬→┃BYREF ┠─→┃TYPE┠─┴→
 ┗━━━━━┛ ┗━━━┛ | │ ┗━━━━━┛↑|  ┗━━━━━┛↑ │ ┗━━━┛↑ ┗━━┛↑
               | └────────┘└─────────┘ └──────┘     │
               |         ┏━━━━━┓                    |
               └────────→┃TYPEDBYREF┠────────────────────┘
                         ┗━━━━━┛
という順で指定されるものです。
詳細は、CLI 仕様書の "Partition II: Metadata Definition and Semantics" 内にある
"23.2 Blobs and s ignatures" の "LocalVarSig" のあたりを参照してみて下さい。

それを踏まえて読み取ると、今回指定した、
 &H7, &H2, &H8, &H8
は、それぞれ
 LOCAL_SIG, Count, TYPE, TYPE
の意味で記述されたものなのだと思います。

LOCAL_SIG は &H7 固定です。IL でいうところの .locals ディレクティブのシグネチャを意味しています。
Count はローカル変数の数を表す 1 以上の整数です。
TYPE は、文字通りデータ型。&H8 の場合は、ELEMENT_TYPE_I4 すなわち Int32 型を意味します。

なので IL 的には『.locals (int32 a, int32 b)』、VB 的には『Dim a, b As Integer』という宣言に
相当する署名を表しているのだと思います。


……ただ、何故 &H7, &H2, &H8, &H8 が選択されているのかが読み取れませんでした。

今回のコードである
Shared Function MyAdd(ByVal iA As IntegerByVal iB As IntegerAs Integer
    Return iA + iB
End Function
の場合、IL的には「.locals init (int32 MyAdd)」だけで済むはずなので、今回は
info.SetLocalSignature(New Byte() {&H7, &H1, &H8}) で良いような気もします。


ちなみに CHoge.MyAdd メソッドの戻り値を、As Integer から As Object に変更した場合、
ローカル変数は「.locals init (object MyAdd)」となるため、ELEMENT_TYPE_I4 は使えません。
この場合は、System.Object 型を意味する ELEMENT_TYPE_OBJECT = &H1C を指定して、
info.SetLocalSignature(New Byte() {&H7, &H1, &H1C}) という指定になります。