3

私は最近、VS2010 で ILVisualizer を使用して、IL の動的メソッドを調べ始めました。ただし、IL ストリームから LocalVariable 情報を抽出するわけではないので、試してみます (もちろん、それを楽しむためであり、良い学習体験だからです :)

静的にコンパイルされたメソッドの場合、GetMethodBody() を介してメソッドの本体にアクセスし、そこからローカル変数を取得できるため、これは問題ではありません。

ただし、DynamicMethods では、GetMethodBody() を介してメソッド本体を使用することはできません。CIL仕様に従って、ローカル署名をバイト配列として取得し、そこからメソッドのローカルのカウント、タイプ、およびインデックスを抽出できる回避策を見つけました。ネイティブ型 (short、byte、string...) を扱っている限り、すべて問題ありません。

ただし、ローカル変数がクラス型の場合、ローカル署名内の ELEMENT_TYPE_CLASS ではなく、ELEMENT_TYPE_INTERNAL (0x21) フラグで参照されます。

残念ながら、ELEMENT_TYPE_INTERNAL として格納されている型を読み取る方法については何も見つかりません。どうしたの ?MS は動的メソッドに非標準 CIL を使用しますか? これらの署名を正しく読み取る方法を知っている人はいますか?

編集mscorlib.dll のいくつかのソース ファイルに出くわし、SignatureHelper のソースから、クラスがランタイム タイプの場合にこれが発生する可能性があることがわかりました。そこは調べてみます…

4

1 に答える 1

1

まあ、私はそれを手に入れたと思います!

ELEMENT_TYPE_INTERNAL フラグの後のデータは圧縮されたデータではなく、4 バイトに格納されたプレーンな 32 ビット整数 (プラットフォームによっては 64、確認する必要があります) であることが判明しました。これは、参照先へのポインターです。タイプ。

IntPtr から RuntimeTypeHandle を取得する方法が見つかりませんでしたが、メソッドの DynamicScope オブジェクト内のトークンをループして値を比較すると、型ハンドルが取得されます。

于 2012-05-16T14:38:49.167 に答える