質問

サードパーティのツールに頼らずに既存の .NET アセンブリを変更する方法はありますか?私はそれを知っています ポストシャープ これは可能ですが、PostSharp の開発者が基本的に機能全体を書き直さなければならなかったのは非常に無駄だと思います。 System.Reflection 既存のアセンブリを変更可能にするための名前空間。

System.Reflection.Emit 新しい動的アセンブリの作成のみが許可されます。ただし、ここで使用されるすべてのビルダー クラスは、基本的なリフレクション クラス (例: TypeBuilder から継承します System.Type)。残念ながら、動的に読み込まれた既存の型を型ビルダーに強制する方法はないようです。少なくとも、公式にサポートされている方法はありません。

では、サポートされていない場合はどうなるでしょうか?既存のアセンブリや型をそのようなビルダー クラスに読み込むことを可能にするバックドアを知っている人はいますか?

わかってください、私は ない 現在のアセンブリを変更する方法を探しています (これは 5月 たとえ不当な要求であっても)、ディスクからロードされた既存のアセンブリを変更するだけです。そんなことはないと思いますが、とにかくお聞きしたいです。

最悪の場合は、次のような手段に頼らなければなりません。 ildasm.exe コードを逆アセンブルしてから、 ilasm.exe 再組み立て用ですが、ツールチェーンがありません(読んでください:IL リーダー) は、IL データを操作するために .NET に含まれています (または存在しますか?)。

/編集:

具体的な使用例はありません。既存のアセンブリにパッチを適用するのは非常に一般的なタスクであるため、私は汎用ソリューションに興味があるだけです。たとえば、難読化ツール、プロファイラー、または AOP ライブラリ (後者は できる 実装方法が異なります)。これまで述べてきたように、既存のインフラストラクチャの大部分を書き直すことを強いられるのは、非常に無駄であるように思えます。 System.Reflection.


@ウェッジ:

あなたが正しい。ただし、ここには具体的な使用例はありません。これを反映するために元の質問を変更しました。私の興味は、質問者が命令をどのように注入できるかを知りたがっていた別の質問によって引き起こされました。 pop そして ret Lutz Roeder の Reflector が (VB または C#) ソース コードを再設計するのを防ぐために、すべてのメソッドの最後に追加されます。

さて、このシナリオは多くのツールを使用して実現できます。上記のPostSharpと レフレシル Reflector 用のプラグイン。これは、 セシル 図書館。

全体として、私は .NET Framework に満足していません。

@ジョエル:

はい、この制限については承知しています。重要なことなので、とにかく指摘してくれてありがとう。

@マルキシダッド:

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

うーん、それについては調べてみます。

役に立ちましたか?

解決

使用できます MethodInfo.GetMethodBody().GetILAsByteArray(), 、それを変更してから、再び接続します MethodBuilder.CreateMethodBody().

他のヒント

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

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

厳密な名前を削除すると、アセンブリに対してほぼ何でもできるようになります。楽しむ!

より具体的な使用例を提供していただければ助かります。問題を解決するには、これよりも優れた方法がある可能性があります。

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

重要な点が 1 つあります。アセンブリが 署名済み, 、変更は失敗し、不発に終わります。

.NET Framework アセンブリは署名されており、Joel Coehoorn 氏が言ったように、不合格となるでしょう。

IronRuby を使用してアセンブリをロードし、夢見ることができるすべての機能を組み込むことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top