問題タブ [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# - ILGenerator の適切なラッパーはありますか?
System.Reflection.Emit をしばらく使用していますが、バグが発生しやすいのと同じくらい苦痛です (そうでない人はいませんか?)。
SRE を直接操作するよりも安全で簡単な方法で IL を生成するために信頼できる、IL ジェネレーターの優れたラッパーがあるかどうか知っていますか?
編集:
式ツリーを操作することは、IL を直接出力するよりも断然簡単で安全であることはわかっていますが、現時点ではいくつかの制約もあります。コード ブロックを作成したり、ループを使用したり、複数のローカル変数を宣言して操作したりすることができません。.NET 4 がリリースされるまで待つ必要があります :)
さらに、既に SRE に依存しているコード ベースを扱っています。
明らかに、ILGenerator は私が必要とするすべてを行います。しかし、それを操作するときは、もっと助けていただければ幸いです。かなり低いレベルのままである ILGenerator ラッパーについて言及しているとき、次のようなメソッドを提供できるものについて考えます。
これは実際には 3 つの素朴な例ですが、私の予想を示すには十分かもしれません。これは一連の拡張メソッドとして見ることができますが、RunSharpのように条件付きステートメントとループをサポートすると便利です。実際、RunSharp は私が望むものにかなり近いですが、ILGenerator を抽象化しすぎて、そのすべての機能を公開していません。
どこかは思い出せませんが、オープンソース プロジェクトでそのようなヘルパーを見たことがあります。
.net - ストアド プロシージャの呼び出しに autosproc を使用しないことの落とし穴や正当な理由はありますか?
3 番目のモンキー アプローチ ( http://www.codeproject.com/KB/database/DynamicMethod_ILGenerator.aspx )のバリエーションを使用して、データリーダーから汎用エンティティを設定するデータ アクセス レイヤーを実装しました。これはうまく機能し、うまく機能し、データ取得のために何度も繰り返しコードを書く必要がなくなりました。
ここで、ジェネリック エンティティを受け取り、ストアド プロシージャにフィードするためのパラメーター リストに変換するメソッドを追加して、サルのトリック コレクションにデータの永続性を追加したいと考えています。
http://msdn.microsoft.com/en-us/library/ms973259.aspxでいくつかのガイダンスとautosproc ソリューションのサンプル コードを見つけました。紙の上では見栄えがよく、これを組み込むつもりですが、autosproc を実装するユーザーエクスペリエンスの点で簡単なグーグルはあまり現れませんでした。すでに。
では、autosproc を使用したことがありますか? うまくいきましたか?パフォーマンスなどに、エンタープライズ アプリケーションに適さない大きな欠陥はありますか?
アドバイスをいただければ幸いです。
c# - DynamicMethod と ILGenerator を使用した C# での動的イベント生成
実行時に EventInfo オブジェクトに基づいてイベント ハンドラーを生成し、そのイベント ハンドラー内でメソッドを呼び出す必要があります。次のようなもの:
コメント部分の IL コードを生成するのに助けが必要です。
c# - 動的オブジェクトプロパティポピュレータ(反射なし)
CodeProjectのDynamicBuilderと同様の方法で、リフレクションを使用せずにオブジェクトのプロパティを設定したいと思います。CodeProjectの例は、DataReaderまたはDataRecordを使用してエンティティにデータを入力するように調整されています。私はこれをいくつかのDALで効果的に使用しています。次に、辞書またはその他のデータに依存しないオブジェクトを使用するように変更して、DAL以外のコード(現在リフレクションを使用している場所)で使用できるようにします。私はOpCodesとILについてほとんど何も知りません。私はそれがうまく機能し、反射よりも速いことを知っています。
私はCodeProjectの例を変更しようとしましたが、ILを知らなかったため、2行で行き詰まりました。
- それらの1つはdbnullsを扱っており、それを失う可能性があると確信していますが、その前後の行が関連しているかどうか、またどちらを実行する必要があるかはわかりません。
- もう1つは、以前はデータレコードから値を引き出していたもので、現在はディクショナリから値を引き出す必要があると思います。「getValueMethod」を「property.Value」に置き換えることができると思いますが、よくわかりません。
私はこの猫の皮を剥ぐための代替/より良い方法にもオープンです。
これまでのコードは次のとおりです(コメントアウトされた行は私が固執している行です):
編集:
Marc GravellのPropertyDescriptor実装(HyperDescriptorを使用)を使用すると、コードが100倍単純化されます。私は今、次のテストを行っています:
TypeDescriptor.GetProperties()とPropertyDescriptor.SetValue()の両方のパフォーマンスに関する考慮事項に関するコメントは大歓迎です...
c# - C# コードを変換する
次の関数を C# コード (ilGenerator.Emit を使用) でシミュレートする必要があります。
誰でも私を助けることができますか?
c# - Reflection.Emitを使用して、「using(x){...}」ブロックを発行しますか?
C#でReflection.Emitを使用してusing (x) { ... }
ブロックを発行しようとしています。
コードを記述している時点で、IDisposableを実装するオブジェクトであるスタックの現在の最上位を取得し、これをローカル変数に格納し、その変数にusingブロックを実装してから、その中にさらに追加する必要があります。コード(私はその最後の部分を扱うことができます。)
これは、Reflectorでコンパイルして確認しようとしたC#コードのサンプルです。
これはReflectorでは次のようになります。
Reflection.Emitを使用するときに、最後にある「.try...」の部分をどのように処理するかわかりません。
誰かが私を正しい方向に向けることができますか?
編集:メールでコードについて尋ねられた後、ここに流暢なインターフェイスコードを投稿しますが、クラスライブラリの一部を入手しない限り、誰にとってもあまり役に立たないでしょう。それも少しのコードです。私が苦労していたコードはIoCプロジェクトの一部であり、サービスのメソッド呼び出しの自動ロギングを実装するクラスを生成する必要がありました。基本的には、コードを自動生成するサービスのデコレータークラスです。
すべてのインターフェイスメソッドを実装するメソッドのメインループは次のとおりです。
EmitUsingは、Jonが応答したBeginExceptionBlockを吐き出すので、それを知る必要がありました。
上記のコードはLoggingDecorator.csからのものであり、IL拡張機能は主にILGeneratorExtensions.Designer.csにあり、その他のファイルはLVK.Reflection名前空間にあります。
.net - CILメソッドですべての引数をスタックにロードする必要があるのはなぜですか?
私のアプリケーションでは、複数のプロパティを含む型を動的に作成する必要があります。このような場合、ILGeneratorを使用して、プロパティのgetterメソッドとsetterメソッドの両方に対してCILを生成する必要があることを認識しています。
何よりも試行錯誤の末、ついにセッターメソッドを生成する次のコードにたどり着きました。
コードは十分に機能しますが、私が理解していないことが1つあります。'Ldarg_0'命令を呼び出す必要があるのはなぜですか?
メソッドの暗黙の最初の引数である「this」参照を参照していることを知っているので、セッターの実際の値は2番目の引数に格納されます。Ldarg_1命令のみを呼び出すだけで十分だと思いました。これにより、2番目の引数がスタックにプッシュされます(最終的に、セッターでは、「this」参照を調べる必要がないため、次のことを行う必要はありません。それで何でもします)、しかしこれは私がプロパティの値を設定しようとするとTargetInvocationExceptionがスローされる結果になります。
ありがとうございました!
c# - オブジェクトを ILGenerator のスタックの一番上に配置する
関数にオブジェクトのインスタンスを渡す必要があるため、明らかに、引数として取得するすべての情報を評価スタックにロードする必要があります。ここに私が探しているコードがあります
タイプだけでクラスに格納されている情報は必要ありません。プリミティブタイプを使用して決定を下すことはできません
最後に、ポインターを使用して、いくつかのオペコードを使用して型をロードできることを読みました...しかし、ここで完全に失われました。正しい方向へのヘルプまたはポインターは素晴らしいでしょう:)
[アップデート]
私は自分の質問に対する答えを見つけて試してみましたが、それが正しい方法であるかどうかはわかりませんが、オブジェクトを正常に作成してスタックにロードし、それを関数に渡すことができます
SomeFunctionMethodInfo は、オブジェクトを引数として受け取る関数です。オブジェクトを関数に渡すことに成功し、それを操作してクラスをオブジェクトとして返すこともできます。
この例への参照はどこにも見つかりませんでした。MSDN で見つけただけです。何か間違っているのでしょうか、それとも欠点がありますか? あなたがそれを修正するか、より良い答えを提供できるかどうか、専門家にお願いします
c# - Microsoft ILGenerator の出力ファイルはどこにありますか?
Microsoft ILGenerator とその Emit メンバーを使用しました。それによって生成された出力ilファイルがどこにあるのか知りたいです。
c# - Calli がデリゲート コールよりも速いのはなぜですか?
Reflection.Emit をいじっていて、あまり使われていないEmitCalli
. 興味をそそられて、通常のメソッド呼び出しと何か違うのだろうかと思ったので、以下のコードを作成しました。
コードを x86 モードと x64 モードで実行しました。結果?
32 ビット:
- デリゲート バージョン: 994
- カリのバージョン: 46
64 ビット:
- デリゲート バージョン: 326
- カリのバージョン: 83
質問はもう明らかだと思います...なぜこんなに大きな速度差があるのでしょうか?
アップデート:
64 ビットの P/Invoke バージョンも作成しました。
- デリゲート バージョン: 284
- カリのバージョン: 77
- P/Invoke バージョン: 31
どうやら、P/Invoke の方が速いようです...これは私のベンチマークの問題ですか、それとも私が理解できない何かが起こっているのでしょうか? (ちなみに私はリリースモードです。)