問題タブ [reflection.emit]
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.
cil - スタックに値型を間接的にロードすることは可能ですか?
Microsoft IL では、値の型でメソッドを呼び出すには、間接参照が必要です。「il」という名前の ILGenerator があり、現在、スタックの一番上に Nullable があるとします。値があるかどうかを確認したい場合は、次を出力できます。
ただし、それをローカル変数として保存することをスキップして、次のように、既にスタックにある変数のアドレスでメソッドを呼び出すだけでよいでしょう。
命令の ldind ファミリ (特に ldind_ref) は有望に見えますが、これが値のボックス化を引き起こすかどうかを知るための十分なドキュメントが見つかりません。
私は C# コンパイラの出力を見てきましたが、ローカル変数を使用してこれを実現しているため、最初の方法が唯一の方法である可能性があります。誰にも良いアイデアはありますか?
**** 編集: 追記 ****
次のプログラムの行をコメントアウトした場合のように、メソッドを直接呼び出そうとしても機能しません (「操作によりランタイムが不安定になる可能性があります」というエラーが表示されます)。行のコメントを外すと、期待どおりに機能し、「True」が返されることがわかります。
したがって、値型であるため、スタック上の値を使用してメソッドを単純に呼び出すことはできません (ただし、参照型の場合は可能です)。
私が達成したい (またはそれが可能かどうかを知りたい) のは、コメントアウトされている 3 行を置き換えることですが、一時的なローカルを使用せずにプログラムを動作させ続けることです。
.net - 既存の .NET アセンブリの変更
サードパーティのツールに頼らずに、既存の .NET アセンブリを変更する方法はありますか? PostSharpがこれを可能にしていることは知っていますが、PostSharp の開発者System.Reflection
が既存のアセンブリを変更可能にするために基本的に名前空間全体の機能を書き直さなければならなかったのは非常に無駄だと思います。
System.Reflection.Emit
新しい動的アセンブリの作成のみを許可します。ただし、ここで使用されるすべてのビルダー クラスは、基本的なリフレクション クラスから継承されます (たとえばTypeBuilder
、から継承されSystem.Type
ます)。残念ながら、既存の動的に読み込まれた型を型ビルダーに強制する方法はないようです。少なくとも、公式にサポートされている方法はありません。
では、サポートされていない場合はどうでしょうか。既存のアセンブリまたは型をそのようなビルダー クラスにロードできるバックドアを知っている人はいますか?
注意してください、私は現在のアセンブリを変更する方法を探しているのではなく(これは不合理な要求かもしれません)、ディスクからロードされた既存のアセンブリを変更するだけです。そのようなことはないと思いますが、とにかくお聞きしたいです。
最悪の場合、ildasm.exe
コードを逆アセンブルしてからilasm.exe
再アセンブルする必要がありますが、IL データを操作するためのツールチェーン (読み: IL リーダー) が .NET に含まれていません (またはありますか?)。
/編集:
特定のユースケースはありません。既存のアセンブリにパッチを適用することは非常に一般的なタスクであるため、汎用ソリューションに興味があります。たとえば、難読化ツール、プロファイラー、または AOP ライブラリを考えてみましょう (そうです、後者は別の方法で実装できます)。すでに述べたように、既存のインフラストラクチャの大部分をSystem.Reflection
.
@ウェッジ:
あなたが正しい。ただし、ここでは特定の使用例はありません。これを反映するように元の質問を変更しました。Lutz Roeder の Reflector が (VB または C#) ソース コードをリエンジニアリングするのを防ぐために、質問者がどのように命令pop
を挿入し、すべてのメソッドの最後に挿入できるかを知りたがっていたという別の質問によって、私の興味がかき立てられました。ret
現在、このシナリオは、前述の PostSharp や、 Cecilライブラリを使用する Reflector 用のReflexilプラグインなど、多くのツールで実現できます。
全体として、私は .NET フレームワークに満足していません。
@ジョエル:
はい、私はこの制限を認識しています。重要なことなので、とにかく指摘してくれてありがとう。
@マルキシダード:
これが唯一の実行可能なアプローチのようです。ただし、これは、ビルダー クラスを使用して完全なアセンブリを再作成する必要があることを意味しますよね? つまり、アセンブリ全体を手動で調べる必要があります。
うーん、調べてみます。
.net - .NETのReflection.Emitを使用してインターフェイスを生成する
一部のメソッドに異なる属性を設定することを除いて、既存のインターフェイスと同じメンバーをすべて使用して、実行時に新しいインターフェイスを生成する必要があります(一部の属性パラメーターは実行時まで不明です)。どうすればそれを達成できますか?
.net - アセンブリが正しく保存されない
アセンブリを生成し、含まれている型でメソッドを呼び出すための非常に単純なコードがいくつかあります。メソッドが呼び出されて正しく実行されますが、Reflector を使用して生成されたアセンブリを表示すると、型が表示されません。
以下はサンプルコードです。
ここに、Reflector からの対応する逆アセンブリがあります。
... と ...
アセンブリを適切に保存するのを手伝ってくれる人はいますか?
.net - コールとCallvirt
CIL命令「Call」と「Callvirt」の違いは何ですか?
c# - 実行時にメソッドに属性を追加するにはどうすればよいですか?
Microsoft.Practices.CompositeUI.EventBroker を使用して、アプリケーションでイベントのサブスクリプションとパブリケーションを処理しています。これが機能する方法は、次のようにトピック名を指定して、イベントに属性を追加することです。
次に、次のように、同じトピック名で別の属性をハンドラーに追加します。
次に、すべてを一致させる EventInspector にオブジェクトを渡します。
これをデバッグする必要があるため、すべてのイベントをサブスクライブするデバッグ クラスを作成しようとしています。すべてのトピック名のリストを取得できます...ただし、実行時のみです。したがって、デバッグ オブジェクトを EventInspector に渡す前に、実行時にメソッドに属性を追加できる必要があります。
実行時にメソッドに属性を追加するにはどうすればよいですか?
c# - 基本クラスのイベント ハンドラーを呼び出す MSIL は何ですか?
イベント EventConsumed とメソッド OnEventConsumed を次のように定義する EventConsumer というクラスがあります。
OnEventConsumed ランタイムに属性を追加する必要があるため、System.Reflection.Emit を使用してサブクラスを生成しています。私が欲しいのは、これに相当する MSIL です:
私がこれまでに持っているのはこれです:
型を作成し、型のインスタンスを作成し、その OnEventConsumed 関数を呼び出すと、次のようになります。
...これはまったく役に立ちません。私は何を間違っていますか?基本クラスのイベント ハンドラーを呼び出す正しい MSIL は何ですか?
.net - AppDomain の作成速度はどのくらいですか?
Reflection.Emit を介してアセンブリを生成する場合、.NET フレームワークは、Reflection.Emit クラスが GC されないようにする静的メンバーに参照を保持することを発見しました。
制限により DynamicMethod を使用できません。また、プログラムの過程で多くのアセンブリ (IronScheme のインクリメンタル コンパイラ) を生成します (1000 以上になる場合もあります)。
したがって、別のドメインでコード生成を処理し、後でアンロードすることを考えていました (これを処理する方法を決定していません)。
これがどれだけ高価になるか経験のある人はいますか?
c# - Reflection.Emit を使用した奇妙なパラメータ シーケンス
私は最近、Reflection.Emit を見てきました。同じパラメーターを持つ別のメソッドを単純に呼び出す DynamicMethod を生成する単純なプログラムを作成しました
この例を実行すると、1,2,3,4,5,6が出力されると予想されますが、2,3,4,5,6,1が出力されます
理由はよくわかりません... Reflection.Emit を使用するための優れたリソースを知っている場合は、その方向性を教えてください。Emit AddIn で Reflector を使用しています。
乾杯
ローハン
c# - すべてのアセンブリの依存関係を見つける、Reflector スタイル
Reflection.Emit を使用してオンザフライでアセンブリを生成し、それを保存しています。これには、1 つの Type と静的な Main() メソッドが含まれています。
.NET は、必要なアセンブリを自動的に参照するのに十分親切です。ただし、Main() では、別のアセンブリからのメソッドへの呼び出しがあり、標準的な方法では参照されません。
アセンブリが実行されると、ランタイムはこのアセンブリを探しますが、見つからないという問題があります。
Reflector はこれを検出し、この余分なアセンブリを「依存」リストの下に表示します。Reflection API を使用してこれらの暗黙的な依存関係を取得するにはどうすればよいですか?
ありがとう