Domanda

Vorrei essere in grado di ottenere tutti i valori dei parametri dallo stack frame in .NET.Un po' come puoi vedere i valori nello stack di chiamate nel debugger di Visual Studio.Il mio approccio si è concentrato sull'utilizzo di Classe StackFrame e poi riflettere su a Informazioni sui parametri vettore.Ho avuto successo con la riflessione e le proprietà, ma questo si sta rivelando un po' più complicato.

Esiste un approccio per raggiungere questo obiettivo?

Il codice finora è simile al seguente:

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 al seguente:

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 di più a questo:

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

Giusto per un po' di contesto, il mio piano era di provare a usarlo quando lancio le mie eccezioni.Esaminerò i tuoi suggerimenti in modo più dettagliato e vedrò se riesco a trovarli adatti.

È stato utile?

Soluzione

Sembra che non sia possibile farlo in questo modo.Fornirà solo metainformazioni sul metodo e sui suoi parametri.Non il valore effettivo al momento dello stack di chiamate.

Alcuni suggeriscono di derivare le tue lezioni da Oggetto associato al contesto e utilizzare IMessageSink per essere avvisato di tutte le chiamate di metodo e dei valori dei parametri.Questo è normalmente utilizzato per Servizi remoti .NET.

Un altro suggerimento potrebbe essere quello di scrivere un debugger.Questo è il modo in cui l'IDE ottiene le sue informazioni.Microsoft ha Mdbg di cui è possibile ottenere il codice sorgente.Oppure scrivi a Profilatore CLR.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top