2010-07-07 5 views
7

In den Beispielen auf ihrer Website hat PostSharp eine Demo von abfangenden Aufrufen in Hauptsystemassemblys. Ich habe ein paar Mal versucht, die besagten Abfangaufrufe auf Assemblys einzurichten und zu replizieren, für die ich den Quellcode nicht ohne Erfolg habe.PostSharp auf Baugruppen Ich habe keine Quelle für

Mein Ansatz bestand darin, einfach das Assembly-Level-Attribut für den Namespace und die Methode, die ich instrumentieren wollte, zu platzieren. Das hat bei mir nie funktioniert.

so etwas wie:

[assembly: ("My.BusinessLayer *" "myCategory", AttributeTargetTypes =) Trace]

Fehle ich etwas hier? Kann ich meinen Instrumentierungsaspekt nicht auf eine Assembly injizieren, wenn ich nicht die Quelle dafür eingegeben habe? Ich dachte, ich könnte Laufzeit-Injektionen ...

Vielen Dank.

Antwort

5

Sie können Methoden anderer Baugruppen verfolgen, indem festgelegt wird:

[assembly: Trace("MyCategory", 
       AttributeTargetAssemblies="xyz", 
       AttributeTargetTypes = "My.BusinessLayer.*")] 

Allerdings wird die externe Montage nicht verändert werden! Es können nur Aufrufe aus dem aktuellen Projekt in die externe Baugruppe geändert werden.

Es ist derzeit nicht einfach, Baugruppen zu ändern, für die Sie keine Quelle haben. Dies ist möglich, wird jedoch als erweitertes Szenario angesehen und erfordert eine benutzerdefinierte Codierung.

+0

Gael, So ... Wenn ich einen Komponententest erstellt habe und ich einen Methodenaufruf abfangen wollte, weil es eine "hohe Kosten" -Methode ist ... Ich könnte die Überwachung hinzufügen, wie Sie oben sprechen, aber nur die Einheit die Aufrufe des Tests würden abfangen, wenn ich direkt anrufe, aber nicht die Assembly, die ich Anrufe auf die gleiche Methode prüfte? Wenn ich das machen wollte, müsste ich den Schnittpunkt in der Baugruppe haben, die ich teste? - Haben Sie Beispiele für dieses erweiterte Szenario verfügbar? Das würde mich sehr interessieren. – pinvoke

+0

Ja, das ist es. Angenommen, Sie haben Assemblies A und B, B Referenzen A. Sowohl A als auch B rufen die Methode Thread.Sleep auf. In Projekt B haben Sie einen Aspekt auf Thread.Sleep gesetzt. Nur Anrufe von B nach Thread.Sleep werden abgefangen, nicht Anrufe von A. –

+0

Und da Sie P-Invoke anscheinend mögen, ist es auch möglich, Aspekte auf P-Invoke-Methoden zu setzen :). –

Verwandte Themen