1

Mac OS X に切り替えるまで問題なく動作していたサードパーティ ライブラリ JInt (JavaScript インタープリター) を使用しています。ある種の Js-Clr ブリッジを作成します。このメソッドには、最後に次の指示があります。

code.Emit(OpCodes.Ldnull);
FieldInfo fieldInfo = typeof(JsUndefined).GetField("Instance");
code.Emit(OpCodes.Ldfld, fieldInfo);

これらの行がどのように実行されるかは次のとおりです (フルサイズのスクリーンショットはこちら)

ここに画像の説明を入力

引数が null でないことは明らかですがfieldInfo、これらの行を実行すると、LDFLD には引数がないことに注意してください。(フルサイズのスクリーンショットはこちら):

ここに画像の説明を入力

実行される私の現在のステートメントは Ldnull です。「ステップ イン」(Ldnull 経由) を実行すると、Ldfld 経由で BANG 例外が発生します (フル サイズのスクリーンショットはこちら)::

ここに画像の説明を入力

助言がありますか?

4

2 に答える 2

1

あなたが説明するこの問題は、さまざまな問題の組み合わせです。

  • IL分解では、フィールドのオペランドは表示されません。それはあなたのフィールドのためだけではありません、あなたはldsfldのために前に分解でそれを見ることができます。それについては心配していませんが、MonoDevelopのバグがあることを報告することをお勧めします。

  • JIntは、奇妙なパターンを使用して、スタックに静的フィールドをロードしています。このパターンを出力することで、Mono2.10.6で問題とNREを再現できます。良いニュースは、マスターで修正されていることです。JIntのコードにアクセスできるので、NREを防ぐために、elseブランチを変更して次のように簡単に読み取ることができます。

    code.Emit(OpCodes.Ldsfld、typeof(JsUndefined).GetField( "Instance"));

これでうまくいきます。

于 2011-12-15T19:55:10.563 に答える
0

ldfldは常に引数が必要です。そうしないと、無効な CLR が取得され、ランタイム環境がその読み込みを拒否する必要があります (不正な形式の CIL を含むアセンブリは、読み込み時に例外をスローします)。

なんらかの理由で、 this の引数であるフィールド参照がldfld実行時に解決できないと思います (コードの作成時には存在しますが)。一方ではこれがldfldIDE で引数なしを取得する理由であり (ロードできないため型は表示されません)、他方ではこの特定の行を実行すると null 例外が発生します。

JsUndefined動的に作成されたアセンブリが、その型を含むアセンブリを正しく参照していますか? コード ジェネレーターはそれを見ることができますが、生成されたコードはそれを見ることができますか?

于 2011-12-15T18:59:37.570 に答える