3

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.*")]

だから、あなたへの私の質問は...私は何が欠けているのですか?一致する属性ターゲットでのメソッド呼び出しは機能していないようです。

4

4 に答える 4

2

これは、PostSharp の現在のバージョンでは不可能です。

PostSharp は、CLR によって読み込まれる前にアセンブリを変換することによって機能します。現在、それを行うには、次の 2 つのことを行う必要があります。

  • アセンブリは CLR にロードされようとしている必要があります。ショットは 1 回しかなく、この時点で取得する必要があります。
  • 変換段階が終了すると、追加の変更を行うことはできません。つまり、実行時にアセンブリを変更することはできません。

最新バージョンの 1.5 CTP 3 では、これら 2 つの制限のうち最初の制限が取り除かれていますが、実際の問題は 2 番目の制限です。ただし、これは非常にリクエストの多い機能であるため、目を離さないようにしてください。

ユーザーは、実行時に PostSharp を使用できるかどうかをよく尋ねられるため、コンパイル時にアスペクトを知る必要はありません。展開後に側面を変更することは、サポート スタッフがソフトウェアの個々の部分のトレースまたはパフォーマンス監視を有効/無効にできるため、非常に有利です。それが可能にするクールなことの 1 つは、サードパーティのアセンブリにアスペクトを適用することです。

可能かと問われれば、答えはイエスです!残念ながら、長い答えはもっと複雑です。

ランタイム/サードパーティの側面に関する落とし穴

著者は、実行時に変更を許可した場合に発生するいくつかの問題についても概説します。

さて、落とし穴は何ですか?

  • ブートストラップを差し込む。コードが (たとえば、ASP.NET または COM サーバーで) ホストされている場合、ブートストラップをプラグインすることはできません。したがって、ランタイム ウィービング テクノロジには、アプリケーションを自分でホストする必要があるという制限があります。
  • CLR の前であること。CLR は、変換されていないアセンブリを独自に見つけた場合、変換されたアセンブリを要求しません。そのため、変換されたアプリケーション用に新しいアプリケーション ドメインを作成し、変換されたアセンブリをそのバイナリ パスに配置する必要がある場合があります。大した問題じゃないかも。
  • 強い名前。ああ。実行時にアセンブリを変更する場合は、厳密な名前を削除する必要があります。それはうまくいきますか?はい、ほとんどです。もちろん、このアセンブリへのすべての参照から厳密な名前を削除する必要があります。それは問題ではありません; PostSharp は、すぐに使用できるようにサポートしています。しかし、PostSharp が解決できないことがあります。文字列またはファイル (たとえば、app.config) に厳密な名前の参照がある場合、それらを見つけて変換することはほとんどできません。したがって、ここには本当の制限があります。厳密に名前が付けられたアセンブリへの「緩い参照」はあり得ません。変換できるのは、実際の参照のみです。
  • LoadFrom。Assembly.LoadFrom、Assembly.LoadFile、または Assembly.LoadBytes を使用するアセンブリがある場合、ブートストラッパーはスキップされます。
于 2009-03-16T10:15:25.677 に答える
1

AttributeTargetAssembliesを「PresentationFramework」に変更すると、機能する可能性があると思います。(まだPostSharpをダウンさせないでください)。

WPFのアセンブリはPresentationFramework.dllです。AttributeTargetAssembliesには、ターゲットとするdllが必要です。

于 2008-09-18T22:47:23.697 に答える
1

PostSharp には新しいバージョンがあり、ダウンロード ページのリンクから [すべてのダウンロード] にアクセスできます。

PostSharp 1.5 Mono、Compact Framework、Silverlight のサポート、アスペクト継承などの新機能を含む PostSharp の開発ブランチ。新しい機能を試して、新しい開発をテストすることでコミュニティを支援し、API の信頼性と安定性が劣っていても構わない場合は、このブランチからダウンロードしてください。

バージョンは現在 1.5 CTP 3 ですが、Silverlight をサポートしています。

于 2009-03-13T20:23:57.837 に答える
0

フレームワーク内(つまり、独自のコード内ではない)で呼び出しを傍受しようとしている場合、それは機能しません。PostSharpは、独自のアセンブリ内のコードのみを置き換えることができます。発信している通話を傍受しようとしている場合は、機能するはずです。ビルド出力でPostSharpが実行されているのがわかりますか?

于 2008-09-19T02:24:37.480 に答える