2009-09-05 5 views
15

機能、使いやすさ、ドキュメント、サンプル、コミュニティ/サポート、VS統合、既知の実装、長期的な実行可能性、およびカスタムAOPフレームワークを実装する速度を構築しますか?AOPフレームワークを実装するためのMono Cecil vs. PostSharp Core vs. Microsoft CCI

私は(私は、これまでにPostSharpを試してみました)知っていることから始めましょう:

  • Microsoft共通コンパイラ Instrastruture(CCI):私は はFxCopのために使用されていることを読みました、ILMerge、Spec#および コード契約。それは非常に低いレベルのようですas it does not even take care of correcting offsets for branch codes that are borken when IL is modified with it
  • PostSharpは5歳、AOP(例えば抄録 あなたが離れILを使って手動で行う に持っている必要がありますいくつかのもの)のために多くの 能力を持っている、開発可能なソース コードは、/だけ一人で をサポートしかし、彼はこのビジネスを作る に計画している、 ドキュメントを持っていますが、良いかもしれません、 は取るビルドを約2倍長く、IL を注入すると、バージョン2.0はすぐに多くのことを約束 を解放する方法について非常に 小さなサンプル改善されました。
  • モノセシル一人によって書かれた、モノスイートの一部と プラグインは反射のために存在するがモノセシルを使用Reflexil と呼ばれます。

答えて

6

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

+0

あなたの経験を共有していただきありがとうございます! PEVerifyツールを使用して、生成されたアセンブリを検証することができると思います。私は今PostSharpを使用しています。私はこれまでこれまでにやっていたことをすべてやり遂げることができました(そして、あなたはその理由を見つけることが正しいです、それは非常に不満かもしれません...)。もっと成熟していくとどういう意味ですか?より少ないバグ? PostSharpを使用しない理由は何ですか?好奇心のために、あなたのプログラムは何をしていますか? –

+0

私のプログラムはアセンブリー合併/縮小ですので、PostSharpは私の助けにはなりませんでした。そして、はい、私はMicrosoft.CCIのバグが少なく、より多くのCLI機能(例えば、混合アセンブリ)をサポートしています。しかし、オブジェクトモデルは実際には使用が難しいです。 PEVerifyを使用して生成されたアセンブリをチェックしましたが、それがなければ成功するかどうかはわかりません:)しかし、エラーはしばしばアセンブリ生成プロセスを壊し、PEVerifyはそのような場合役に立たない。 – skevar7

4

そこにすでにあるほとんどのフレームワークと同じように、私は自分自身のAOPフレームワークを実装に関して、あなたにお勧めします:はそれをしないでください。商業的にサポートされているポストシャープ(soon-to-be)PostSharp、Typemockで動くAOPフレームワークのCThruを含むいくつかのサイトが既に存在します。

とにかく、私はMono.Cecilを使いやすくなっています。これは、Reflection.Emitをうまく処理する必要性を抽象化し、Monoコミュニティのサポートを受けています。

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

+0

私は、コンパイル時にコードを注入するAOPにのみ興味があります。 –

+0

LinFuはそうしています。それはILを織るコンパイル後のタスクを持っています。 –

+1

LinFu.AOPはコンパイル後のタスクでコードを挿入できるように型を変更するILを作成しますが、実際のコードは実行時に注入されます。 –

3

AFAIK、LinFuはMono.Cecilで構築されています。

私はPostSharpと言います。コアは他のフレームワークよりも高いレベルの機能を持っているので、大きな作品には使いにくいです。あなたは低レベルで作業することもできますが、バイナリレベルでは(意図的に)作業することはできません。 PostSharpを使用してアセンブリの合併/縮小を行うこともできますが、ILASMを使用してコンパイルし直すという事実にはいくつかの制限があります(たとえば内部のメンバーでも名前を付けるなど)。逆にILASMをバックエンドとして使用すると、ILASMは多くのルールを検証し、生成されたMSILコードを簡単に読むことができるため、PostSharpの上で開発する方がはるかに簡単です。 PostSharpはコード生成のデバッグに役立つコメントをMSILに追加することもできます。

別のポイント:カスタムアスペクト(データベースエンジンを開発し、永続性のアスペクトを提供する場合など)を行うには、MSILリライタだけではありません。あなたはあなたの仕事の多くを行うAOインフラストラクチャが必要です。カスタムアスペクトを開発しているときは、カスタムアスペクトに特有の作業の1%、アスペクトインフラストラクチャの39%、MSILリライタのものが60%と言います。私はしばしばPostSharpに基づいて数時間で非常に特定の側面をプログラムすることができます。

質問に戻って、もちろん私自身のバイアで、私は言うでしょう:obfuscator、合併/縮退などを書いたければ、Mono.CecilまたはMicrosoft.CCIにポストシャープのライセンスよりも親しみやすいものであれば、そのライセンスの理由だけです。しかし、カスタムアスペクトを開発したいだけなら、週、を節約できます。PostSharpを再配布する予定がある場合は、商用条件に驚かれるでしょう。

+0

いいですね。私はポストシャープに固執するつもりだと思います。 –

関連する問題