Получить значения параметров из кадра стека в .NET?
-
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.