Получить значения параметров из кадра стека в .NET?

StackOverflow https://stackoverflow.com/questions/75076

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Некоторые предлагают создавать классы из Контекстбаундобжект и использовать IMessageSink получать уведомления обо всех вызовах методов и значениях параметров.Обычно это используется для Удаленное взаимодействие .NET.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top