16

カスタム AOP フレームワークを実装する機能、使いやすさ、ドキュメント、サンプル、コミュニティ/サポート、VS 統合、既知の実装、長期的な実行可能性、ビルド速度の点で優れているのはどれですか?

私が知っていることから始めます(これまでPostSharpを試しただけです):

  • Microsoft Common Compiler Instrastruture (CCI) : FxCop、ILMerge、Spec#、およびコード コントラクトに使用されていることを読みました。ILが変更されたときに壊れるブランチコードのオフセットを修正することさえしないので、それは非常に低レベルのようです。
  • PostSharpは 5 歳で、AOP のための多くの機能を備えています (たとえば、IL を使用して手動で行う必要があるいくつかのことを抽象化します)。にはドキュメントがありますが、改善される可能性があります。ビルドには約 2 倍の時間がかかります。IL を注入する方法に関するサンプルはほとんどなく、バージョン 2.0 はすぐにリリースされ、大幅な改善が約束されています。
  • Mono Cecil : Mono スイートの一部であり、Mono Cecil を使用する Reflexil と呼ばれる Reflector 用のプラグインがあります。
4

3 に答える 3

6

Microsoft.CCI と Mono.Cecil はどちらも低レベルであり、生成されたアセンブリを検証しません。生成コードやアセンブリ構造に誤りがあると、原因究明に時間がかかります。
タスクに十分な機能がある場合は、PostSharp を使用することをお勧めします。
それ以外の場合は... Mono.Cecil には、より優れた、より理解しやすく、使いやすいオブジェクト モデルがあります。しかし、自分のプログラムで使用すると醜いバグがありました (間違ったメソッドへの参照がアセンブリに保存されました。メタデータ トークンの処理にバグがあったと思います)
。同時に、多くの単純な機能が欠けています。ただし、Mono.Cecil よりも成熟しています。最後に、Mono.Cecil を放棄し、プログラムに Microsoft.CCI を使用しました。

于 2009-09-06T04:22:59.900 に答える
3

私の知る限り、LinFuはMono.Cecil上に構築されています。

PostSharp.Core は他のフレームワークよりも高度な機能を備えているため、大規模な作品に使用するのは難しくありません。低レベルでも作業できますが、(設計上) バイナリ レベルでは作業できません。PostSharp を使用してアセンブリのマージ/シュリンカーを実行できますが、ILASM を使用してコンパイルを戻すという事実により、いくつかの制限が設定されます (たとえば、内部メンバーにも名前を付ける必要があります)。一方、バックエンドとして ILASM を使用すると、PostSharp 上での開発がはるかに簡単になります。ILASM は多くのルールを検証し、生成された MSIL コードを簡単に読み取ることができるからです。PostSharp では、コード生成のデバッグに役立つコメントを MSIL に入れることもできます。

もう 1 つのポイント: カスタム アスペクトを行いたい場合 (たとえば、データベース エンジンを開発し、永続化アスペクトを提供したい場合)、MSIL リライター以上のものが必要です。多くの作業を代行してくれる AO インフラストラクチャが必要です。カスタム アスペクトを開発している場合、作業の 1% がカスタム アスペクトに固有であり、39% がアスペクト インフラストラクチャであり、60% が MSIL リライタ関連であると言えます。PostSharp に基づいて、非常に特定の側面を数時間でプログラミングできることがよくあります。

それで、あなたの質問に戻って、もちろん私自身のバイアスで、難読化ツール、マージ/シュリンカーなどを作成したい場合は、Mono.Cecil または Microsoft.CCI を使用してください。 PostSharp のライセンスよりも使いやすい場合はライセンス。しかし、カスタム アスペクトを開発したいだけの場合は、PostSharp を使用すると数週間節約できます。また、PostSharp の再配布を計画している場合に提供できる商用条件に驚かれることでしょう。

于 2009-09-06T17:56:14.320 に答える
3

既に存在するほとんどのフレームワークと同様に、独自の AOP フレームワークの実装に関して、次のことをお勧めします(まもなく) 商業的にサポートされる PostSharp や、 Typemockを利用した AOP フレームワークであるCThruなど、すでにいくつかのものがあります。

とにかく、Mono.Cecil は非常に使いやすいことがわかりました。適切に対処する必要性を抽象化しReflection.Emit、Mono コミュニティのサポートを受けています。

LinFuをご覧になることをお勧めします。これはオープンソースのライブラリ セットであり、そのうちの 1 つは Mono.Cecil の上に実装された AOP フレームワークです。CodeProject にLinFu AOPに関する素晴らしい記事があります。

于 2009-09-05T10:10:41.940 に答える