PostSharp を使用して Silverlight オブジェクトへの呼び出しをインターセプトしますか?
質問
PostSharp を使用して、所有していないオブジェクトへのメソッド呼び出しをインターセプトしていますが、アスペクト コードが呼び出されていないようです。Silverlight 分野のドキュメントはかなり緩いようですので、皆さんが提供していただけると助かります:)
次のような属性があります。
public class LogAttribute : OnMethodInvocationAspect
{
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
// Logging code goes here...
}
}
そして、AssemblyInfo のエントリは次のようになります。
[assembly: Log(AttributeTargetAssemblies = "System.Windows", AttributeTargetTypes = "System.Windows.Controls.*")]
それで、あなたへの質問は...私には何が欠けているのでしょうか?一致する属性ターゲットの下でのメソッド呼び出しは機能しないようです。
解決
これは、PostSharp の現在のバージョンでは不可能です。
PostSharp は、CLR によって読み込まれる前にアセンブリを変換することによって機能します。現時点では、これを行うには次の 2 つのことが起こる必要があります。
- アセンブリは CLR にロードされる直前である必要があります。チャンスは 1 回だけなので、この時点で撃たなければなりません。
- 変換段階が完了した後は、追加の変更を行うことはできません。つまり、実行時にアセンブリを変更できないということです。
最新バージョン 1.5 CTP 3、 これら 2 つの制限のうち最初の制限を削除します, しかし、本当に問題なのは2番目です。ただし、これは、 要望の多かった機能, なので、目を離さないようにしてください。
ユーザーは、実行時に PostSharp を使用できるかどうかをよく尋ねます。そのため、コンパイル時に側面を知る必要はありません。導入後に側面を変更することは、サポート スタッフがソフトウェアの個々の部分のトレースやパフォーマンスの監視を有効/無効にできるため、実際に大きな利点があります。 これにより可能になる素晴らしい機能の 1 つは、サードパーティのアセンブリにアスペクトを適用できることです。
それが可能かどうかと問われれば、簡単に答えます。 残念ながら、長い答えはさらに複雑です。
ランタイム/サードパーティのアスペクトの問題
著者は、実行時の変更を許可した場合に発生する問題のいくつかについても概説します。
さて、問題点は何でしょうか?
- ブートストラップを接続します。 コードがホストされている場合(たとえば、ASP.NETまたはCOMサーバーで)、BootStrapperをプラグインすることはできません。したがって、ランタイムウィービングテクノロジーは、アプリケーションを自分でホストする必要があるという制限に縛られています。
- CLRの前にいること。 CLRが変換されていないアセンブリを独自のもので見つけた場合、変換されたアセンブリを要求しません。したがって、変換されたアプリケーションの新しいアプリケーションドメインを作成し、変換されたアセンブリをバイナリパスに配置する必要がある場合があります。それは多分大きな問題ではないかもしれません。
- 強烈な名前。 ああ。実行時にアセンブリを変更する場合、その強い名前を削除する必要があります。うまくいきますか?はい、ほとんどです。もちろん、このアセンブリへのすべての参照から強い名前を削除する必要があります。それは問題じゃない;Postsharpはすぐにサポートしています。しかし、ポストシャープが助けることができないものがあります:文字列やファイルに強く名前の参照がある場合(たとえば、app.configで)、それらを見つけることはほとんどなく変換できます。だからここには本当の制限があります:強い名前のアセンブリへの「ゆるい参照」はあり得ません。実際の参照のみを変換することができます。
- ロード元。 任意のアセンブリがassembly.loadfrom、assembly.loadfile、またはassembly.loadbytesを使用している場合、bootstrapperがスキップされます。
他のヒント
AttributeTargetAssemblies を「PresentationFramework」に変更すると機能する可能性があると思います。(PostSharp はまだそれほどうまく動作していません)。
WPF のアセンブリは、PresentationFramework.dll です。AttributeTargetAssemblies には、対象となる DLL が必要です。
PostSharp には新しいバージョンがあり、ダウンロード ページの「すべてのダウンロード」リンクからアクセスできます。
ポストシャープ 1.5Mono、Compact Framework、Silverlight のサポート、アスペクト継承などの新機能を含む PostSharp の開発ブランチ。新しい機能を試したい場合や、新しい開発をテストすることでコミュニティを支援したい場合、また API の信頼性と安定性が劣ることを許容できる場合は、このブランチからダウンロードしてください。
現在のバージョンは 1.5 CTP 3 ですが、Silverlight がサポートされています。
フレームワーク内 (つまり、独自のコード内ではない) で呼び出しをインターセプトしようとすると、機能しません。PostSharp は、独自のアセンブリ内のコードのみを置き換えることができます。自分が発信している通話を傍受しようとしている場合は、機能するはずです。ビルド出力で PostSharp が実行されているのがわかりますか?