問題タブ [dynamic-method]
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# - .NET 動的メソッドのデバッグ
私たちのシステムではLINQを非常に広く使用しています。特に LINQ-to-objects。そのため、場所によっては、メモリ内の LINQ クエリがいくつかの巨大な式から構築されることになります。問題は、式にバグがある場合に発生します。そのため、NullReferenceException が発生し、スタック トレースはどこにも ([Lightweight Function] に) つながりません。例外は、LINQ によって生成された動的メソッド内でスローされました。
そのような動的メソッドをデバッグする簡単な方法はありますか? それとも、WinDBG を学ぶために自分自身を犠牲にする必要がありますか? :-)
c# - リフレクションを使用する代わりに、構造体のフィールドを設定する動的メソッドを生成します
struct
使用中のリフレクションのフィールドを更新する次のコードがあるとします。DynamicUpdate
構造体インスタンスはメソッドにコピーされるため、渡される前にオブジェクトにボックス化する必要があります。
コードは正常に機能します。さて、リフレクションは遅いので使いたくないとしましょう。代わりに、フィールドを直接変更するCILを生成id
し、そのCILを再利用可能なデリゲートに変換します(たとえば、動的メソッド機能を使用)。特に、上記のコードを次のようなs/tに置き換えたいと思います。
私の質問:CreateSetIdDelegate
次のテクニックのいずれかを使用する以外に実装する方法はありますか?
- リフレクションを使用してセッターを呼び出すCILを生成します(この投稿の最初のコードセグメントとして)。リフレクションを取り除くことが要件であることを考えると、これは意味がありませんが、実装の可能性があるので、ここで説明します。
- を使用する代わりに
Action<object, object>
、署名が。であるカスタムデリゲートを使用しますpublic delegate void Setter(ref object target, object value)
。 Action<object, object>
を使用する代わりにAction<object[], object>
、配列の最初の要素をターゲットオブジェクトとして使用します。
2と3が好きではない理由は、オブジェクトのセッターと構造体のセッターに異なるデリゲートを設定したくないためです(また、set-object-fieldデリゲートを必要以上に複雑にしたくないためです。例Action<object, object>
)。の実装でCreateSetIdDelegate
は、ターゲットタイプが構造体かオブジェクトかによって異なるCILが生成されると思いますが、同じAPIをユーザーに提供する同じデリゲートを返すようにしたいです。
c# - ラムダを IL のストリームとしてセカンダリ AppDomain に渡し、DynamicMethod を使用して組み立て直す
ラムダ式を IL バイトのストリームとしてセカンダリ AppDomain に渡し、DynamicMethod を使用してそこに戻して呼び出すことができるようにすることは可能ですか?
そもそもこれが正しい方法かどうかはよくわからないので、この質問をする(詳細な)理由は次のとおりです...
私のアプリケーションでは、リフレクションのためにいくつかのアセンブリをロードする必要がある場合が多いため、次にそれらをどうするかを決定できます。問題の部分は、アセンブリを検討し終わった後にアセンブリをアンロードできるようにする必要があることです。これは、別の を使用してそれらをロードする必要があることを意味しますAppDomain
。
さて、私のケースのほとんどは、完全ではないことを除いて、似たようなものです。たとえば、簡単な確認を返す必要がある場合もあれば、アセンブリからのリソース ストリームをシリアル化する必要がある場合もあり、1 回または 2 回のコールバックを行う必要がある場合もあります。
AppDomain
そのため、同じやや複雑な一時的な作成コードを何度も何度も書きMarshalByRefObject
、新しいドメインと元のドメインの間で通信するカスタム プロキシを実装することになります。
これはもはや受け入れられないため、次のAssemblyReflector
ように使用できるクラスをコーディングすることにしました。
AssemblyReflector
AppDomain
のおかげでアンロードが自動化され、別のリフレクション コードを透過的に保持するタイプのラムダIDisposable
を実行できるようになります。Func<Assembly,object>
AppDomain
問題は、ラムダを他のドメインに簡単に渡すことができないことです。そのため、検索した後、まさにそれを行う方法のように見えるものを見つけましAppDomain
た.ILストリームとしてラムダを新しいものに渡します-そして、それは元の質問に私をもたらします.
これが私が試したものですが、うまくいきませんでした(BadImageFormatException
新しいデリゲートを呼び出そうとしたときに問題がスローされていました):
私は近づいていますか(何が欠けていますか?)、それともこれは無意味な練習ですか?
注:これが機能した場合でも、参照に関してラムダに何を入れるかについて注意する必要があることを認識しています。しかし、それは問題ではありません。
更新: もう少し先に進むことができました。メソッドを再構築するには、単純に呼び出すだけでSetCode(...)
は十分ではないようです。必要なものは次のとおりです。
トリックは次のとおりです。元の IL には、元のメソッドのコンテキストでのみ有効な特定のメタデータ トークンが含まれています。IL を解析し、それらのトークンを新しいコンテキストで有効なものに置き換える必要がありました。これは、 Drew WilsonとHaibo LuoILTokenResolver
の 2 つのソースから採用した特別なクラス を使用して行いました。
これにはまだ小さな問題があります。新しい IL は正確には有効ではないようです。ラムダの正確な内容に応じて、実行時に InvalidProgramException がスローされる場合とスローされない場合があります。
簡単な例として、これは機能します:
これはしませんが:
まだ決定されていない違いに応じて、機能するかどうかのより複雑な例もあります。小さいながらも重要な詳細を見逃している可能性があります。しかし、ildasm の出力をより詳細に比較すれば、それが見つかると確信しています。発見したら、ここに投稿します。
編集:ああ、男。この質問がまだ未解決であることを完全に忘れていました。しかし、おそらくそれ自体が明らかになったので、これを解決することを断念しました。私はそれについて満足していません、それは確かです。本当に残念ですが、これを再試行する前に、フレームワークや CLR からのサポートが改善されるのを待つことにします。これを機能させるには多くのハックを行う必要があり、それでも信頼性は高くありません。興味を持ってくださった皆様、申し訳ありません。
.net - .NET で動的メソッドから内部メソッドを呼び出すことは可能ですか?
動的に生成されたメソッドから内部メソッドを呼び出そうとしています。il コードは単純です: ldarg_0、callvirt、ret.
メソッドの実行は、内部メソッドが定義されている型を読み込めないことを示す TypeLoadException で失敗します。
考えてみると、動的メソッドのホスト アセンブリは、メソッドの宣言型アセンブリのフレンドではないため、これは論理的に思えます。
ただし、Delegate.CreateDelegate が機能するのと同じように、動的メソッドがまだ機能することを期待していました。結局のところ、内部メソッドの MethodInfo を取得できたので、アクセス許可の障壁は背後にあります。
とにかく、問題は「動的に生成されたメソッドから内部メソッドを呼び出すことは可能ですか?」ということです。
ありがとう。
編集:
問題を示す簡単なコード サンプルを次に示します。
コードでは、2 つのオープン インスタンス デリゲートを作成して、Data.String インスタンス プロパティにアクセスします。
- Delegate.CreateDelegate を使用して safe getter1 と入力します
- DynamicMethod を使用して安全でない getter2 を入力します
Delegate.CreateDelegate によって作成されたタイプ セーフなデリゲートは機能しますが、DynamicMethod を使用するデリゲートは TypeLoadException で失敗します。
ゲッターが作成されるコンテキストは一般的ではないため、タイプセーフなアプローチを取りたくないことに注意してください。もちろん、この問題は解決できますが、問題はプリンシパルの問題です。Delegate.CreateDelegate が成功するのに DynamicMethod が失敗するのはなぜですか?
java - Java は動的メソッド呼び出しをサポートしていますか?
ここでF()
は、動的に呼び出されていますね。
この記事には次
... Java バイトコードは動的メソッド呼び出しをサポートしていません。サポートされている呼び出しモードは、invokestatic、invokespecial、invokeinterface、invokevirtual の 3 つです。これらのモードでは、既知の署名でメソッドを呼び出すことができます。強く型付けされた言語について話します。これにより、コンパイル時に直接いくつかのチェックを行うことができます。
一方、動的言語は動的型を使用します。したがって、コンパイル時に未知のメソッドを呼び出すことはできますが、Java バイトコードではそれはまったく不可能です。
私は何が欠けていますか?
ruby-on-rails - PHPのマジックメソッド__call、__ get、および__setに相当するRuby
Rubyにはこれら(__call、__ get 、__ setに相当)があると確信しています。そうでなければ、find_byはRailsでどのように機能するのでしょうか。たぶん誰かがfind_byと同じように動作するメソッドを定義する方法の簡単な例を与えることができますか?
ありがとう
ruby-on-rails - Ruby / Railsでその場でメソッドを定義する-パラメータを設定する方法は?
与えられたパラメータを渡すことができる関数のセットを定義しようとしています。
たとえば、次のようにするにはどうすればよいですか?
ruby-on-rails - クラス メソッドの設定方法は知っていますが、その場でインスタンス メソッドを設定するにはどうすればよいですか?
- 以前、クラス メソッドについて質問しましたが、インスタンス メソッドについてもどうすればよいか本当に知りたいです。ありがとう!=)
以下のコードは、特定の配列のクラス メソッドを設定します。
問題は、インスタンスに対して同じメソッド セットを取得するにはどうすればよいかということです。
python - Python:Selfを使用し、その場でオブジェクトにメソッドを追加する
これが私の考えです:単純なオブジェクトから始めます:
そして、事前に作成されたメソッドをその場で追加できるようにするには、次のようにします。
私がこれを行うことができるように:
問題は、次のように_someMethod()のself部分を指定する必要があることです。
メソッドがオブジェクトに「アタッチ」されている場合、それは自己暗示的ではないので、これはちょっと奇妙に思えますか?
私はPythonの考え方に不慣れで、C#のような言語の同じ思考プロセスから抜け出そうとしているので、ここでのアイデアは、追加する検証方法を選択して選択することにより、検証用のオブジェクトを作成できるようにすることです。ある種のオブジェクト階層を作成するのではなく、それに。私は、オブジェクトがそれに接続されたメソッドに自分自身を送信することを暗黙的に知っていると思ったので、Pythonの「自己」のアイデアが私の好意で機能するだろうと考えました。
注意すべき点の1つは、メソッドがオブジェクトにアタッチされていない(完全に異なるファイル)ので、それが問題である可能性がありますか?たぶん、それ自体でメソッドを定義することによって、自己は実際には問題のメソッドであり、したがってオブジェクトとして暗示することはできませんか?