問題タブ [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.
c# - ILに従って動的にReflection.Emitを使用してC#クラスを作成する方法
インターフェースがあるとします:
計算ロジックはJavaScript (実際には TypeScript) コードで実装されています。Reflection.Emit を使用して次の実装を動的に作成したいので、単体テストを C# 実装と共有できます。
IL DASM から IL を取得できます。
そのために TypeCreator を作成しました。
次のように使用します。
例外をスローします。
アセンブリ 'MyAssyFor_ICalculator、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null' のタイプ 'Imp_ICalculator' のメソッド 'Calculate' には実装がありません。
どうしたの?
c# - ILGenerator.Emit を使用してフィールドでメソッドを呼び出す方法は?
myMethod
で次のメソッドを生成する方法を知りたいですilGenerator
。
誰かが私を助けることができますか?
c# - FieldInfo を使用せずに OpCodes.Ldsfld を使用できますか?
GetType と GetField の使用を避けたい。Ldsfld で文字列を使用できますか? 以下に、達成しようとしていることのモックアップを含めました。ご覧のとおり、私は IL Generation を初めて使用します。アプリケーションでのリフレクションのコストの一部を取り除こうとしています。
.net - .maxstack は反射によってどのように計算されますか?
多数の switch ステートメントを含むメソッドを生成しています。ildasm で .maxstack の値が非常に高いことに気付きました。私の理解では、.maxstack は特定のメソッドの最大スタック深度ですか? オンラインに関する多くの情報を見つけることができません。
最初の 2 つの例では、最大スタック サイズは 4KB を超えています。最後の例では、最大スタック サイズは 509 ですが、実際の最大深度は 10 のようです。値がこれほど高いのはなぜですか? これは、jit の単なるヒントですか? このような高い .maxstack を持つことの影響はありますか? それが最大深度であることについて私がインターネットで読んだことはすべて間違っていますか?
アップデート
私の3番目の例に間違いがあったようです。私は検証もテストもしていませんでした.load引数の後に余分なプッシュがありました. maxstack が 9 であることを修正した後。最初の 2 つの例では、reflection.emit で最大スタック サイズが 4K を超えたままです。C# コンパイラでは、switch メソッドは、リフレクション エミットの 4502 ではなく 9 です。
答えによると、C#コンパイラがそれをより正確に計算するときに、それらを合計するときに各基本ブロックの最大深度を追加するようです。このような高い価値の意味についてはまだ興味があります。
// 間違いです。これにより、スタック サイズが非常に大きくなりました。// generator.Emit(OpCodes.Ldc_I4, index);
c# - C# リフレクションで IL ジェネレーターを使用して静的フィールドでメソッドを呼び出す
C# リフレクションから新しいType
ビアを生成しています。TypeBuilder
私が今抱えている問題は、静的フィールドでメソッドを呼び出すメソッド本体を構築する方法です。
現在、(実行時に) 生成されたクラスは次のようになります。
だから今、私は次のようなメソッドを生成しています:
Ilジェネレーターのスタックに静的フィールドをロードし、その上で特定のメソッドを呼び出す方法を教えてください。
c# - IlGenerator はスロー後に leave を発行します
ilgenerator でメソッドを生成していますが、問題があります。IlGenerator.BeginCatchBlock()
この場合、到達不可能な命令です。
実際、出力は次のようになります
.try ブロックに IL_0011 を残さないことを期待していました。PEVerify はエラーを表示しません。
c# - DynamicMethod に他のメソッドを呼び出させる
クライアントコードに依存するイベントの名前とアクションを渡すことで、任意のオブジェクトの任意のイベントをサブスクライブできるようにしたいと考えています。次のコードがあります
上記のコードの使用法:
イベントが発生すると、InvalidProgramException が発生します。これが難しいことはわかっています。単純に += を使用してサブスクライブすることもできますが、コードがクラッシュする理由を誰か教えていただけますか? ILGenerator.Emit に何か問題があると思いますが、何か提案はありますか?