Ottieni i valori dei parametri da uno stack frame in .NET?

Mi piacerebbe essere in grado di ottenere tutti i valori dei parametri dal frame dello stack in .NET. Un po ‘come è ansible vedere i valori nello stack di chiamate quando si trova nel debugger di Visual Studio. Il mio approccio si è concentrato sull’utilizzo della class StackFrame e quindi sulla riflessione su un array ParameterInfo . Ho avuto successo con la riflessione e le proprietà, ma questo si sta rivelando un po ‘più complicato.

C’è un approccio per raggiungere questo?

Il codice finora è simile a questo:

class Program { static void Main(string[] args) { A a = new A(); a.Go(1); } } public class A { internal void Go(int x) { B b = new B(); b.Go(4); } } public class B { internal void Go(int y) { Console.WriteLine(GetStackTrace()); } public static string GetStackTrace() { StringBuilder sb = new StringBuilder(); StackTrace st = new StackTrace(true); StackFrame[] frames = st.GetFrames(); foreach (StackFrame frame in frames) { MethodBase method = frame.GetMethod(); sb.AppendFormat("{0} - {1}",method.DeclaringType, method.Name); ParameterInfo[] paramaters = method.GetParameters(); foreach (ParameterInfo paramater in paramaters) { sb.AppendFormat("{0}: {1}", paramater.Name, paramater.ToString()); } sb.AppendLine(); } return sb.ToString(); } } 

L’output è simile a questo:

 SfApp.B - GetStackTrace SfApp.B - Go y: Int32 y SfApp.A - Go x: Int32 x SfApp.Program - Main args: System.String[] args 

Mi piacerebbe che assomigliasse più a questo:

 SfApp.B - GetStackTrace SfApp.B - Go y: 4 SfApp.A - Go x: 1 SfApp.Program - Main 

Solo per un po ‘di contesto, il mio piano era cercare di usarlo quando lancio le mie eccezioni. Guarderò i tuoi suggerimenti in modo più dettagliato e vedrò se riesco a vederlo adatto.

Sembra che non si possa fare in questo modo. Fornirà solo meta informazioni sul metodo e i suoi parametri. Non il valore effettivo al momento del callstack.

Alcuni suggeriscono di derivare le classi da ContextBoundObject e utilizzare IMessageSink per essere avvisati di tutte le chiamate di metodo e dei valori dei parametri. Questo è normalmente usato per .NET Remoting .

Un altro suggerimento potrebbe essere quello di scrivere un debugger. Ecco come l’IDE ottiene le sue informazioni. Microsoft ha Mdbg di cui è ansible ottenere il codice sorgente. Oppure scrivi un profiler CLR .