使用Reflection捕获方法状态

有没有办法使用.NETreflection来捕获所有参数/局部变量的值?

您可以使用CLR调试API获取此信息,尽管提取它不是一个简单的几行。

reflection不用于从堆栈中捕获信息。 它读取大会。

您可能想看看StackTrace

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

好文章在这里:

http://www.codeproject.com/KB/trace/customtracelistener.aspx

reflection将告诉您方法具有的参数类型,但在任​​何特定调用期间无法帮助发现它们的值。 reflection根本没有告诉你关于局部变量的任何信息。

您需要调试器用于访问此类信息的API。

我不认为这是可能的,您可以通过查看StackTrace获取方法及其参数。

System.Diagnostics.StackTrace sTrace = new System.Diagnostics.StackTrace(true); for (Int32 frameCount = 0; frameCount < sTrace.FrameCount; frameCount++){ System.Diagnostics.StackFrame sFrame = sTrace.GetFrame(frameCount); System.Reflection.MethodBase thisMethod = sFrame.GetMethod(); if (thisMethod == currentMethod){ if (frameCount + 1 <= sTrace.FrameCount){ System.Diagnostics.StackFrame prevFrame = sTrace.GetFrame(frameCount + 1); System.Reflection.MethodBase prevMethod = prevFrame.GetMethod(); } } } 

我不知道如何使用reflection,但看看使用编织。 SpringFramework.Net允许您定义可以拦截方法调用的切入点。 其他人也可能这样做。

这是“BeforeAdvice”拦截器的链接http://www.springframework.net/docs/1.2.0-M1/reference/html/aop.html#d0e8139

secondlife的人们暂停脚本并在服务器之间移动它们。 这意味着他们必须捕获正在运行的脚本的状态,包括调用堆栈上的变量值。

他们的脚本语言运行在mono,这是.NET运行时的开源实现。 我怀疑他们的解决方案适用于常规的.NET运行时,但关于他们如何做到这一点的演示video (跳到下半部分)可能仍然很有趣。