[Daily Issue] Trovare il chiamante di un metodo tramite Reflection con System.Diagnostics.StackTrace

Uno Issue un pò frettoloso, che oggi forse riesco ad uscire prima delle 9 di sera :)

Mi è capitato di configurare Log4Net in un ambiente che aveva già un logger (che però non funzionava :)) e per evitare di modificare tutte le pagine, ho tenuto la struttura e la severity del Logger esistente levando tutta la logica e chiamando log4Net.
Ho avuto il problema che tutti gli errori mi venivano ovviamente segnalati come partiti dal logger... .(

Un paio di ricerche sull'utilizzo di StackTrace ed ho trovato il metodo perfetto:

Type type = new StackTrace().GetFrame(1).GetMethod().DeclaringType;

Quindi passerò al GetLogger di log4net questo tipo!

Attenzione: andando in debug, possono venire aggiunti dei frame tra la chiamata del metodo e l'effettivo log, perchè se io interrogo per esempio il type con il debugger di visual studio, questo tramite reflection ne invoca proprietà e metodi e crea un frame in mezzo che ovviamente sballa la gerarchia!

Update:

Come giustamente fa notare Massimo: e se il metodo viene sottoposto ad inlining?

A parte il post di Raf citato da Massimo, un pò fuori dal mondo :P... le soluzioni possibili che vedo sono due:

1: Decorare il metodo con l'attributo [MethodImpl(MethodImplOptions.NonInlining)]
2: Fare il metodo Virtual. Se non erro, il Jit non può fare inlinint di un metodo Virtual (l'avevo letto da qualche parte :))

Non so quanto queste siano percorribili cmq :)

Print | posted on giovedì 13 settembre 2007 19.26

Comments on this post

# re: [Daily Issue] Trovare il chiamante di un metodo tramite Reflection con System.Diagnostics.StackTrace

Requesting Gravatar...
E se sui metodi viene fatto inlining dal jit?
C'è un marziano che ha scritto sta roba tempo fa
http://blogs.ugidotnet.org/raffaele/archive/2004/12/12/6924.aspx
Left by Massimo Prota on set 14, 2007 1.35

# re: [Daily Issue] Trovare il chiamante di un metodo tramite Reflection con System.Diagnostics.StackTrace

Requesting Gravatar...
"You can try to defeat the JIT inliner through use of [...]. All these techniques are flawed, and all of them will fail over time. The correct way to control inlining is to use the MethodImpl(MethodImplOptions.NoInlining) pseudo-custom attribute" - Chris Brumme

http://blogs.ugidotnet.org/adrian/archive/2004/12/19/7366.aspx
Left by Adrian Florea on set 14, 2007 10.56

# re: [Daily Issue] Trovare il chiamante di un metodo tramite Reflection con System.Diagnostics.StackTrace

Requesting Gravatar...
wow... se me lo conferma Adrian allora mi fido :)
Left by Alessandro Ghizzardi on set 14, 2007 11.22

Your comment:

 (will show your gravatar)
 
Please add 4 and 2 and type the answer here: