从.NET的堆栈帧中获取参数值?
时间:2020-03-05 18:56:40 来源:igfitidea点击:
我希望能够从.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
仅出于上下文考虑,我的计划是在抛出自己的异常时尝试并使用它。我将更详细地查看建议,并确定是否合适。
解决方案
回答
看来不可能那样做。它只会提供有关方法及其参数的元信息。不是调用栈时的实际值。
有些建议建议从ContextBoundObject派生类,并使用IMessageSink从所有方法调用和参数值中得到通知。这通常用于.NET Remoting。
另一个建议可能是编写调试器。这就是IDE获取信息的方式。 Microsoft具有Mdbg,我们可以从中获取源代码。或者编写CLR分析器。