問題タブ [dynamicmethod]
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# - Reflection.Emit を使用した奇妙なパラメータ シーケンス
私は最近、Reflection.Emit を見てきました。同じパラメーターを持つ別のメソッドを単純に呼び出す DynamicMethod を生成する単純なプログラムを作成しました
この例を実行すると、1,2,3,4,5,6が出力されると予想されますが、2,3,4,5,6,1が出力されます
理由はよくわかりません... Reflection.Emit を使用するための優れたリソースを知っている場合は、その方向性を教えてください。Emit AddIn で Reflector を使用しています。
乾杯
ローハン
.net - リフレクションまたはダイナミックメソッド?
私はいくつかのプロジェクトで NHibernbate を使用してきましたが、ORM についてもいくつか学びました。NHibernate は、実行時にマッピング ファイルを使用してクラスをデータレイヤーに動的にバインドすることを理解しています。
私の質問は、この遅延バインディングがどのように行われるかです。つまり、「Reflection」または「DynamicMethod」のどちらの方法論が使用されているのでしょうか?
万が一、リフレクションを使っている場合、DynamicMethodを使っているORMはありますか?より良いパフォーマンスを提供しますか?
c# - DynamicMethodで生成されたメソッドにカスタム属性を追加するにはどうすればよいですか?
私はExpressionTreesのCompilation(内部で使用)DynamicMethod
をいじっていました。DynamicMethod
次に、生成されたメソッドにカスタム属性を追加する方法があるかどうか疑問に思いました。私はそれについてグーグルで検索しましたが、方法が見つかりませんでした。CodeDomを使用して実行できることは知っていますが、使用したいと思いますDynamicMethod
。
タイプ記述子について誰かが言及しましたが、それが役立つかどうかはわかりません。
を使用して生成されたメソッドにカスタム属性を定義する方法を知っている人はいますDynamicMethod
か?
c# - DynamicMethod と out-parameters?
このように -パラメータを持つデリゲートの DynamicMethod を定義するにはどうすればよいout
ですか?
メソッドを呼び出すときにa
引数をに設定するメソッドが必要だとしましょう。null
これを処理するためのおそらくより良い方法は、メソッドがAction
デリゲートを返すようにすることですが、これは大規模なプロジェクトの単純化された部分にすぎず、問題のメソッドは既に値を返しているため、out
パラメーターを処理する必要があることに注意してください。それに加えて、したがって質問です。
私はこれを試しました:
しかし、私はこれを取得します:
ライン上del(out a);
。
スタックに null をロードし、それを引数に格納しようとする 2 行をコメント アウトすると、メソッドは例外なく実行されることに注意してください。
編集:これは最善のアプローチですか?
c# - 好奇心:コンパイル時にExpression <...>が最小限のDynamicMethodよりも高速に実行されるのはなぜですか?
私は現在、主に楽しみと学習のためにいくつかの最後の手段の最適化を行っていますが、いくつかの質問が残っている何かを発見しました。
まず、質問:
- DynamicMethodを使用してメモリ内にメソッドを構築し、デバッガーを使用する場合、逆アセンブラービューでコードを表示するときに、生成されたアセンブリコードにステップインする方法はありますか?デバッガーは私にとってメソッド全体をステップオーバーするようです
- または、それが不可能な場合は、生成されたILコードをアセンブリとしてディスクに保存して、Reflectorで検査できるようにすることはできますか?
Expression<...>
単純な加算メソッドのバージョン(Int32 + Int32 => Int32)が、最小のDynamicMethodバージョンよりも高速に実行されるのはなぜですか?
これは、デモンストレーションを行う短くて完全なプログラムです。私のシステムでは、出力は次のとおりです。
ラムダとメソッドの呼び出しの値が高くなると予想しましたが、DynamicMethodのバージョンは一貫して約30〜50%遅くなっています(おそらくWindowsや他のプログラムによる変動)。誰もが理由を知っていますか?
プログラムは次のとおりです。
c# - CIL (MSIL) の Stringbuilder
StringBuilder を受け取り、クラス内のすべてのプロパティの値を文字列に書き込むコードを生成しようとしています。私は次のものを持っていますが、現在、次のコードで「無効なメソッドトークン」を取得しています:
何か案は?前もって感謝します :)
c# - 動的メソッドの実用例?
C#を使って動的な方法とその実践例を学びたいです。
動的メソッドとリフレクションの間に関係はありますか?
私を助けてください。
c# - ConstructorInfo.Invoke の DynamicMethod、何を考慮する必要がありますか?
私の質問はこれです:
ConstructorInfo.Invoke呼び出しに対応するDynamicMethodオブジェクトを構築する場合、すべての (またはほとんどの) 型の引数に対処するには、どの型の IL を実装する必要がありますか?呼び出しを行う前に、引数の数が渡されますか?
バックグラウンド
私は IoC コンテナーの 3 回目の反復を行っており、現在、使用されている大量の時間を簡単に削減できる領域があるかどうかを把握するために、いくつかのプロファイリングを行っています。
私が気づいたことの 1 つは、具象型に解決するときに、最終的にConstructorInfo.Invokeを使用してコンストラクターが呼び出され、解決した引数の配列を渡すことになるということです。
私が気づいたのは、invoke メソッドにはかなりのオーバーヘッドがあるということです。これのほとんどは、私が行っているのと同じチェックの別の実装にすぎないのではないかと考えています。
たとえば、コードに一致するコンストラクターがあるため、渡した定義済みのパラメーター名、型、および値に一致するコンストラクターを見つけるために、この特定の呼び出し呼び出しができるはずのもので終わらない方法はありません。適切な数の引数、適切な順序、適切な型、および適切な値に対処するためです。
解決メソッドへの 100 万回の呼び出しを含むプロファイリング セッションを実行し、それを Invoke 呼び出しを模倣するDynamicMethod実装に置き換えると、プロファイリングのタイミングは次のようになりました。
- ConstructorInfo.Invoke: 1973ms
- ダイナミックメソッド: 93ms
これは、このプロファイリング アプリケーションの合計実行時間の約 20% を占めています。つまり、ConstructorInfo.Invoke 呼び出しを同じことを行う DynamicMethod に置き換えることで、基本的なファクトリ スコープのサービスを処理するときに 20% のランタイムを削減できます (つまり、すべての解決呼び出しはコンストラクター呼び出しで終了します)。
これはかなり重要なことであり、このコンテキストでコンストラクター用の安定した DynamicMethod ジェネレーターを構築するのにどれだけの作業が必要かを詳しく調べる必要があると思います。
したがって、動的メソッドはオブジェクト配列を受け取り、構築されたオブジェクトを返します。問題の ConstructorInfo オブジェクトは既にわかっています。
したがって、動的メソッドは次の IL で構成されるように見えます。
他に考慮すべきことはありますか?
アプリケーションを「アクセス制限モード」で実行している場合、動的メソッドの作成はおそらく利用できないことを認識していることに注意してください(脳がこれらの用語をあきらめない場合があります)が、その場合、それを簡単に検出して、オーバーヘッドとすべてを使用して、以前と同じように元のコンストラクターを呼び出します。
c# - 独自のクラスのインスタンスで DynamicMethod を呼び出すと、なぜ例外が発生するのですか?
で実行時に独自の関数を作成して CIL を学習していますReflection.Emit
。今までのやり方がいかに簡単だったかには実際に驚いていますが、自分のやり方を推測できない何かにぶつかり、ドキュメントに関連するものは何も見つかりません。
定義した非常に単純なクラスを単純に出力する関数を作成しようとしています。たとえば、コードを print string
s に変更すると動作しますが、 class のインスタンスを渡すと常に実行に失敗しますA
。
奇妙なのは、関数本体をコメントアウトできることTargetInvocationException
です。それは非常に単純でなければなりませんが、何が起きているのかわかりません!
これを例外として発生させるには、何が間違っているのでしょうか? これが私のクラスでのみ発生するのはなぜですか?