Получить значения параметров из фрейма стека в .NET? - PullRequest
17 голосов
/ 16 сентября 2008

Я хотел бы иметь возможность получить все значения параметров из фрейма стека в .NET. Немного похоже на то, как вы можете видеть значения в стеке вызовов в отладчике Visual Studio. Мой подход был сосредоточен на использовании класса StackFrame , а затем на отражении над массивом ParameterInfo Я имел успех с отражением и свойствами, но это оказывается немного сложнее.

Есть ли подход для достижения этого?

Код до сих пор выглядит так:

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

Вывод выглядит так:

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

Я бы хотел, чтобы это выглядело так:

SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main
<Ч />

Просто для некоторого контекста, я планировал попытаться использовать это, когда я выбрасываю свои собственные исключения. Я рассмотрю ваши предложения более подробно и выясню, смогу ли я найти их подходящими.

1 Ответ

7 голосов
/ 16 сентября 2008

Кажется, так не может быть. Он будет предоставлять только метаинформацию о методе и его параметрах. Не фактическое значение на момент вызова стека.

Некоторые предлагают получить ваши классы из ContextBoundObject и использовать IMessageSink , чтобы получать уведомления обо всех вызовах методов и значениях параметров. Обычно это используется для .NET Remoting .

Другим предложением может быть написание отладчика. Вот как IDE получает свою информацию. Microsoft имеет Mdbg , из которых вы можете получить исходный код. Или напишите CLR профилировщик .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...