問題タブ [ilgenerator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
3159 参照

.net - ILGenerator.Emit* を介して「通常の」メソッドを呼び出す方法は?

DynamicMethod が (たとえば、ILGenerator.EmitCall または同様のものを介して) 「通常の」メソッド、たとえば Private Sub BlahBlah(ByVal obj as Object) を呼び出すことは可能ですか?

前もって感謝します

0 投票する
1 に答える
710 参照

cil - System.Reflection.Emit.ILGeneratorを使用してVB.Netでランダムを呼び出しますか?

自分の言語から.Net実行可能ファイルの出力を生成しています...自分の言語から変換されているオペコード(「ランダム」と呼ばれる)は、特定の範囲内で乱数を作成することになっています。

私のコードの目標は、System.Reflection.Emit.ILGeneratorクラスを使用して乱数を生成することです...CILコードがどのように見えるかを理解するためにいくつかのvb.netコードを作成しました。

どのILDASMが次のように報告しますか:

ILGenerator.Emitメソッドを使用してすべてを再現できます。行IL_0001( "newobj instance void [mscorlib] System.Random ::。ctor()")..を除く。

情報が多すぎて誰もが圧倒されていないことを願っています。しかし、私には複雑に思える問題を説明するときは、冗長にする方がよいと思います。

最後に、これまでに作成したコードがあります。

次のコードを発行します。

私がすでに試したこと

  • IL_Gen.Emit(OpCodes.NewObj、... ctor())...を指す方法を考え出すことは、その方法を理解できません。

  • New()を指す方法を考え出す-それが.ctor()であるように思われるので... Newは、初期化子以外のものとして使用することはできません。

  • より良い放出方法を思い付くまで、ランダム機能を無効にするだけです。

問題は私には難しいように思えますが、コード生成とMSILを私よりも簡単に理解し、答えを喜んで指摘してくれる人がいることは知っています。

御時間ありがとうございます、

ドミニク

0 投票する
1 に答える
493 参照

ilgenerator - ILGenerator、null の戻り値で決定

この関数が呼び出され、特別な条件で「null」の戻り値が提供されます。

その値が null の場合、ラベルにジャンプするかどうかを決定する必要があります

メソッド呼び出しの後に使用する

「JITコンパイラで内部制限が発生しました」という例外が表示されます。その関数を呼び出すと、コードは正しくビルドされます。

OpCodes.Brfalse も試しました。

私は何を間違っていますか?

0 投票する
1 に答える
93 参照

.net - 単純なポップとロードバックが機能しない

を返す関数を呼び出した後、objectスタック上の値をローカル変数に格納してからプッシュバックしようとしましたが、例外で失敗しました

呼び出しのターゲットで例外がスローされました

コードは次のとおりです。

削除Stloc_3してLdloc_3すべてが正常に機能すると、ここで迷子になります。

0 投票する
1 に答える
1721 参照

reflection - ILGenerator。このコードの問題点

動的なプロパティ アクセサーを構築しようとしています。実際のプロパティを呼び出すのと同じくらい非常に高速なものが必要です。非常に遅いため、反射ルートに行きたくない. そこで、DynamicAssembly を使用し、ILGenerator を使用して IL を注入することにしました。以下は、動作しているように見えるILGenerator関連のコードです

したがって、上記のプロパティを含むオブジェクトである最初の引数を取得します。メソッド コレクションには、ネストされたプロパティがあればそれが含まれます。プロパティごとに、値をスタックに置く EmitCall を使用してから、それをボックス化しようとします。これは魅力のように機能します。

唯一の問題は、Order.Instrument.Symbol.Name のようなプロパティがあり、Instrument オブジェクトが null であると想定する場合です。その後、コードは null オブジェクト例外をスローします。

これが私がしたことで、nullチェックを導入しました

このコードは、オブジェクト/メモリが壊れているなどと言って壊れます。このコードの正確なところは何ですか。ここで何かが足りないのですか?

前もって感謝します。

0 投票する
4 に答える
2162 参照

c# - 汎用イベント ハンドラーから動的メソッドへのリダイレクト

任意のイベントからメソッドへの呼び出しをトリガーするために使用されるクラスを作成しようとしていますが、発行された MSIL コードから 'this' を参照する方法を単純に理解できないため、行き詰まっています。

この例は、私が探しているものを説明する必要があります。

これは、使用されているクラスをどのように想定するかのサンプルです。

(上記の例はまったく無意味であることに注意してください。私は探しているものを説明しようとしています。ここでの私の最終的な目標は、任意のイベントが発生するたびに任意のメソッドへの呼び出しをトリガーできるようにすることです。私はそれを使用します100% MVVM を使用しようとしている WPF プロジェクトで、[一見] 古典的な限界点の 1 つに遭遇しました。)

とにかく、任意のイベントが発生したときに「invokedMethod」を正常に呼び出した限り、コードは「機能」しますが、「this」は空のオブジェクトのようです (_parameter は常に null です)。私はいくつかの調査を行いましたが、「this」がこのような動的メソッド内から呼び出されるメソッドに適切に渡される良い例を見つけることができません。

私が見つけた最も近い例はTHIS ARTICLEですが、その例では、「this」は任意のイベント ハンドラーではなくコードから呼び出されるため、動的メソッドに強制することができます。

提案やヒントをいただければ幸いです。

0 投票する
1 に答える
640 参照

c# - ILGenerator: アンマネージ ポインターの使用方法 (VerificationException が発生します)

ユーザーがノードベースの合成、オシレーター、フィルターなどの作成を行って独自のサウンドを作成できるサウンド合成プログラムを作成しています。

プログラムはノードを中間言語にコンパイルし、その後 ILGenerator と DynamicMethod を介して MSIL に変換します。

すべての操作とデータが格納されている配列で動作しますが、後でビットレベルの操作を実行できるようにポインターを使用できれば、より高速になります。

PD: スピードは非常に重要です。

DynamicMethod コンストラクターのオーバーライドの 1 つにメソッド属性があり、その 1 つが UnsafeExport であることに気付きましたが、有効な組み合わせは Public+Static のみであるため、使用できません。

これは、VerificationException をスローする私がやろうとしていることです: (ポインターに値を割り当てるためだけに)

0 投票する
3 に答える
1385 参照

.net - ILGenerator メソッドのインライン化

次のコードが与えられた場合:

メソッド Do の呼び出しはインライン化されます。ループは約 40 ms で終了します。たとえば、Do を仮想関数にすると、インライン化されず、ループは 240 ミリ秒で終了します。ここまでは順調ですね。ILGenerator を使用して Do メソッド (Echo) を生成し、指定されたメイン メソッドと同じループで DynamicMethod を生成すると、Echo メソッドの呼び出しがインライン化されず、ループが完了するまでに約 240 ミリ秒かかります。C# コードと同じ結果を返すため、MSIL コードは正しいです。メソッドのインライン化は JIT によって行われるものだと確信していたので、Echo メソッドをインライン化しない理由はわかりません。

この単純なメソッドが JIT によってインライン化されない理由を知っている人はいますか?

0 投票する
2 に答える
1633 参照

c# - 例外をキャッチするILGeneratorが機能しない

を使用して型のラッパーを生成していSystem.Reflection.Emitます。ある時点で、元のオブジェクトがアクセス時にエラーをスローしている可能性があり(FaultException)、エラーは私が実装したmyによってキャッチされるはずですtry { } catch (Exception e) { }が、そうではありません。

コードはILSpyによって正しく表示されます。

コード生成

これは、アセンブリ生成のコードです。

編集

例外はユーザーコードによってキャッチされますが、ILコードによってはキャッチされません。

分解

ここで顧客の名前空間をいくつか削除しました。書き込み行が最後の数分に追加されました。

編集2

System.ExceptionILコードをスローすると、FaultException'1が発生する前に、例外が処理されます。Exceptionおよびでテスト済みArgumentException

0 投票する
2 に答える
1190 参照

c# - ILGenerator からコードを取得する

ILGenerator を使用して exe ファイルを作成する関数を作成しました。私が望むのは、ILDasm や Reflector などの外部ツールを使用せずに生成された IL 言語をユーザーに表示することです。

プログラムの実行中に、各 OpCode を ILGenerator に追加したので、OpCode 表現の文字列を使用して、この各 OpCode をリストに保存できますが、IL コードを直接取得したいと考えています。それはできますか?

重要: Mono 2.6 を使用しています。