3

.NET アセンブリからバイトコードをプリコンパイルするプログラムに取り組んでいます。このプログラム自体が .NET プログラムです。これまでのところ、リフレクションを使用して、バイトコード自体を含む必要なすべての情報を抽出できました。ただし、 の翻訳を実装する際に問題が発生しましたldfld

ldfld同様の命令には、エンコード内にFieldRefまたはFieldDefを参照するメタデータ トークンがあります。これらは、アセンブリの PE ファイルに埋め込まれたメタデータ テーブルの要素であることを理解しています。最悪の場合、私は ECMA-335 からの十分な情報を持っているので、PE ファイルを開いて自分で調べることができます。リフレクションを介してこのルックアップを行います。

System.Reflection.Assemblyただし、メタデータ トークンを検索するメソッドが見つからないようです。(見逃しただけかもしれません。) メタデータ (catch-22) が表示されるまで参照アセンブリしか知らないため、アセンブリよりも具体的なものを検索することはできません。実際、コメントに記載されているように、メタデータを調べるまで、フィールドがどのアセンブリで定義されているかさえわかりません。

リフレクション経由でそのようなメタデータ トークンを検索する方法はありますか?

4

1 に答える 1

4

AssemblyFieldDef と FieldRef はアセンブリに属しておらず、モジュールに属しているため、には何も見つかりませんでした(ほとんどのアセンブリにはモジュールが 1 つしかありませんが、複数のモジュールを持つことができます)。そしてModule、あなたが望む方法を正確に持っています: ResolveField(). 次のように使用します。

Module module = …;
int fieldToken = …;
FieldInfo field = module.ResolveField(fieldToken);
于 2013-08-16T11:32:48.457 に答える