Pregunta

Me gustaría poder obtener todos los valores de los parámetros del marco de la pila en .NET.Un poco parecido a cómo puedes ver los valores en la pila de llamadas cuando estás en el depurador de Visual Studio.Mi enfoque se ha concentrado en utilizar el Clase de marco de pila y luego reflexionar sobre un Información de parámetro formación.He tenido éxito con la reflexión y las propiedades, pero esto está resultando un poco más complicado.

¿Existe algún enfoque para lograr esto?

El código hasta ahora se ve así:

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();
    }
}

La salida se ve así:

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

Me gustaría que se pareciera más a esto:

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

Solo para tener un poco de contexto, mi plan era intentar usar esto cuando lanzo mis propias excepciones.Examinaré tus sugerencias con más detalle y veré si las veo apropiadas.

¿Fue útil?

Solución

Parece que no se puede hacer así.Solo proporcionará metainformación sobre el método y sus parámetros.No es el valor real en el momento de la pila de llamadas.

Algunos sugieren derivar sus clases de Objeto vinculado al contexto y use IMessageSink para recibir notificaciones sobre todas las llamadas a métodos y los valores de los parámetros.Esto se utiliza normalmente para .NET remoto.

Otra sugerencia podría ser escribir un depurador.Así es como el IDE obtiene su información.Microsoft tiene mdbg del cual puedes obtener el código fuente.O escribe un perfilador CLR.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top