16

サードパーティのツールに頼らずに、既存の .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 フレームワークに満足していません。

@ジョエル:

はい、私はこの制限を認識しています。重要なことなので、とにかく指摘してくれてありがとう。

@マルキシダード:

これが唯一の実行可能なアプローチのようです。ただし、これは、ビルダー クラスを使用して完全なアセンブリを再作成する必要があることを意味しますよね? つまり、アセンブリ全体を手動で調べる必要があります。

うーん、調べてみます。

4

6 に答える 6

11

Mono.Cecil を使用すると、特定のアセンブリから厳密な名前を削除して、署名されていないアセンブリとして保存することもできます。アセンブリから厳密な名前を削除したら、ターゲット メソッドの IL を変更するだけで、他のアセンブリと同じようにアセンブリを使用できます。Cecil で厳密な名前を削除するためのリンクは次のとおりです。

http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

厳密な名前を削除したら、アセンブリで必要なことはほとんど何でもできます。楽しみ!

于 2008-12-18T07:14:24.100 に答える
10

MethodInfo.GetMethodBody().GetILAsByteArray()を使用して変更し、それをMethodBuilder.CreateMethodBody()に再度プラグインできます。

于 2008-09-23T20:23:50.743 に答える
4

より具体的なユースケースを提供していただけると助かります。おそらく、これよりも問題を解決するためのより良い方法があります。

.NET 3.5 では、既存のフレームワーク クラスに拡張メソッドを追加できますが、おそらくそれで十分でしょうか?

于 2008-09-23T20:18:50.053 に答える
3

1 つの重要なポイント: アセンブリが署名されている場合、すべての変更が失敗し、失敗してしまいます。

于 2008-09-23T20:46:36.790 に答える
1

.NET Framework アセンブリは署名されており、Joel Coehoorn が言ったように、失敗するでしょう。

于 2008-09-23T22:57:11.623 に答える
-3

IronRuby を使用してアセンブリをロードし、夢見ることができるすべての機能をミックスインできます。

于 2008-09-23T20:19:28.883 に答える