2010-03-17 7 views
9

Ich weiß Instrumentierung ist eine Technik zum Hinzufügen von Ablaufverfolgungscode dynamisch in die Methoden zum Aktivieren der Ablaufverfolgung und Debuggen.Hinzufügen von Code zum Anfang/Ende von Methoden in Laufzeit dynamisch

Ich frage mich, ob dies nur eine "Trace" -Option ist, fest in die CLR codiert, um nur Trace-Code hinzuzufügen, oder gibt es die Möglichkeit, den Methoden irgendeinen Code hinzuzufügen?

Zum Beispiel möchte ich am Anfang jedes einzelnen Methodenaufrufs in einer bestimmten Klasse nach einer Bedingung suchen (etwa nach Berechtigungen). Kann ich dies durch Hinzufügen von dynamischem Code zum Anfang der Methoden in der Ausführungszeit tun?

Ich bin nicht sicher, wie diese Spur "Instrumentierung" Sache funktioniert, aber ich frage mich, ob dies für andere Ziele auch verwendet werden kann oder nicht.

Antwort

4

Im Grunde, was Sie tun sollten, ist eine CLR Profiler schreiben und die profiler API in C++ verwenden
Sie müssen die ICorProfilerCallback Schnittstelle implementieren.
Was Sie suchen, ist in der JITCompilationStarted Callback. Diese Methode wird jedes Mal aufgerufen, wenn eine verwaltete Methode aufgerufen wird und bevor der JIT-Compiler die AWL in den Maschinencode übersetzt. Alle Code-Einfügearbeiten während der Laufzeit sollten in JITCompilationStarted durchgeführt werden.
Sie können das Open-Source-Coverage-Tool part cover als ein Beispiel betrachten, wie es geht.

0

Ich weiß PostSharp ermöglicht es Ihnen, über zuschreibt, so können Sie hinzufügen Entry/Exit Spuren auf Ihre Methoden

+0

Siehe meinen Kommentar für Mitch Wheat, bitte. – Iravanchi

3

Sie beziehen sich auf Aspect Oriented Programming (AOP) ‚Aspekte‘ zu bestehenden Methoden hinzuzufügen.

Werfen Sie einen Blick auf PostSharp.

auch: Open Source Aspect-Oriented Frameworks in C#

+0

Ich beziehe mich nicht auf AOP, aber ich möchte die Laufzeit-Instrumentierung für AOP verwenden. Ich kenne ein paar gute Frameworks für AOP, und ich habe selbst eines geschrieben (wird bald als Open Source veröffentlicht), und ich habe mich gefragt, ob ich das gleiche wie Laufzeit-Instrumentierung verwenden kann, um Anrufe abzufangen. PostSharp ist dem, was ich im Sinn hatte, am nächsten, aber es funktioniert in Bauzeit. Gibt es eine Laufzeitversion (die tatsächlich der gleichen Methode Code hinzufügt, ähnlich wie PostSharp)? – Iravanchi

2

Wie andere beantwortet haben, so Querschnittsthemen oft mit Aspect Oriented Programming angesprochen werden (AOP).

Eine Möglichkeit, AOP zu tun ist, mit Code-Instrumentierung mit Werkzeugen wie Postsharp, aber eine Alternative, die (DI) und die Decorator Entwurfsmuster durch die Verwendung Dependency Injection keine zusätzlichen Werkzeuge benötigt.

Stellen Sie sich vor, dass Ihr Code die IFoo Schnittstelle verbraucht:

public interface IFoo 
{ 
    string GetStuff(string request); 
} 

Sie können einen konkreten implmentation MyFoo von IFoo haben, aber Sie können auch ein oder mehrere Zierer schreiben, die verschiedene Aspekte behandeln:

public class AdministratorGuardingFoo : IFoo 
{ 
    private readonly IFoo foo; 

    public AdministratorGuardingFoo(IFoo foo) 
    { 
     if (foo == null) 
     { 
      throw new ArgumentNullException("foo"); 
     } 

     this.foo = foo; 
    } 

    public string GetStuff(string request) 
    { 
     new PrincipalPermission(null, "Administrator").Demand(); 

     return this.foo.GetStuff(request);    
    } 
} 

Sie können jetzt (haben Sie Ihren DI Container) MyFoo in AdministratorGuardingFoo wickeln. Alle Verbraucher, die IFoo konsumieren, werden den Unterschied nicht bemerken.