从 .NET 中的堆栈帧获取参数值?

2024-02-06

我希望能够从.NET中的堆栈帧中获取所有参数值。有点像在 Visual Studio 调试器中查看调用堆栈中的值的方式。我的方法集中于使用堆栈框架类 http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe%28v=vs.71%29.aspx然后反思参数信息 http://msdn.microsoft.com/en-us/library/system.reflection.parameterinfo%28v=vs.71%29.aspx大批。我在反射和属性方面取得了成功,但事实证明这有点棘手。

有没有一种方法可以实现这一目标?

到目前为止的代码如下所示:

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

只是为了提供一些上下文,我的计划是在抛出自己的异常时尝试使用它。我会更详细地考虑您的建议,看看是否合适。


看来这样是不行的。它只会提供有关该方法及其参数的元信息。不是调用堆栈时的实际值。

有些人建议从以下位置派生您的课程上下文绑定对象 http://msdn.microsoft.com/en-us/library/system.contextboundobject.aspx并使用消息接收器 http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.imessagesink.aspx收到所有方法调用和参数值的通知。这通常用于.NET 远程处理 http://en.wikipedia.org/wiki/.NET_Remoting.

另一个建议可能是编写一个调试器。这就是 IDE 获取信息的方式。微软有Mdbg http://blogs.msdn.com/jmstall/archive/2004/09/30/236281.aspx您可以获得其中的源代码。或者写一个CLR 分析器 http://msdn.microsoft.com/en-us/magazine/cc300553.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 .NET 中的堆栈帧获取参数值? 的相关文章

  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • 如何自定义 ASP.Net Core 模型绑定错误?

    我只想从我的 Web API Asp net Core 2 1 返回标准化的错误响应 但我似乎不知道如何处理模型绑定错误 该项目刚刚从 ASP NET Core Web 应用程序 gt API 模板创建 我有一个简单的操作定义为 Route
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 使用 Process.Start() 打开文件夹时访问被拒绝异常

    我有一个 C 中的 winforms 应用程序 我必须在其中打开某个文件夹 我用 System Diagnostics Process Start pathToFolder 这会导致以下异常 System ComponentModel Wi
  • 二维数组的列求和

    我有一个IEnumerable
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 来自资源中 ImageSource 的 System.Drawing.Image

    我的问题与这个非常相似 wpf图像资源以及运行时在wpf控件中更改图像 https stackoverflow com questions 940592 wpf image resources and changing image in w
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 应用非限定名称查找而不是依赖于参数的名称查找

    考虑标准 sec 3 4 1 3 中的一个示例 typedef int f namespace N struct A friend void f A operator int void g A a int i f a f is the ty
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • AngularJS - $emit/$on 或范围继承哪个更好?

    假设我得到了以下 HTML 结构
  • 如何在 html 上设置processingJS?

    如何在 html 页面上运行处理 JS 脚本 有人可以给我发送一个测试 html 和一个辅助代码文件以供我了解吗 假设我想运行这个矩形 rect 50 50 50 50 要添加到 Kevin 的答案中 如果您想使用带有 javascript
  • Maven发布更新政策

    我看到releases setting http maven apache org ref 3 2 2 maven settings settings html class releases在maven设置中有一个updatePolicy
  • 语义 UI - 更改主题

    我无法在语义 UI 中选择主题 我尝试按照中提供的说明进行操作工作流程部分 http learnsemantic com guide expert html manual install文档的 文件位于examples 项目的文件夹对于测试
  • QML - 当我不接受鼠标按下事件时无法获取鼠标释放事件

    我想将 onPressed 事件分派给 QML 树中的后续对象 我已指示 mouse accepted false 和propagateCompositedEvents true 但我希望保持 onreleased 事件在顶级元素上工作 这
  • 在 Sass 中乘以百分比

    如何在 Sass 中以合理的方式将两个百分比相乘 例如 考虑以下声明 num1 50 num2 25 num3 num2 num1 Here num3休息 我可以写什么表达方式num3定义为12 5 弄清楚了 首先 您需要将其中一个百分比转
  • 使用API​​将数据插入sqlite3数据库

    我正在尝试将 Web API 中的数据插入到我的数据库中 我在 python 3 7 2 上使用 sqlite3 但找不到任何有关如何执行此操作的教程 到目前为止我所有的代码是 import requests sqlite3 databas
  • 设置 JavaScript 变量 = null,还是保留未定义?

    在 JavaScript 函数顶部声明变量时 最佳实践是将它们设置为 null 还是保留为 未定义 换句话说 什么情况下需要下面的每个选项 选项A var a null b null 选项B var a b 这取决于上下文 未定义 表示该值
  • htaccess / mod_expires - 缓存特定文件

    好吧 我检查了很多关于如何使用管理浏览器缓存的网站 htaccess文件 但我仍然不清楚 我想将特定文件缓存一个月 对于其余的 我希望它每次都能刷新 所以我尝试
  • Hibernate - 使用 all-delete-orphan 清除集合然后添加到它会导致 ConstraintViolationException

    我有这些实体 class Foo Set
  • 使用用户定义的注释生成编译器警告

    是否可以让编译器在遇到用户定义的注释时生成警告 类似的东西 Deprecated注解 Thanks 根据您最初的问题和评论 我假设您正在尝试执行以下操作 将代码标记为不完整 带有编译器警告 以便其他开发人员尚未使用它 稍后识别 IDE 中不
  • 在 python 端在 kivy 中分配 ids

    我正在使用猕猴桃 我想做的是拥有 想法 一个滑块和一个标签 其中包含网格布局中一行中滑块的当前值 现在获取布局很好 但让标签具有与滑块当前值相同的文本值是很棘手的 我尝试使用字符串连接来引用与其配对的滑块具有相同数字后缀的标签 我认为我遇到
  • 跨度文本填充增加跨度大小

    我有以下跨度 span style border solid width 100px hello world span 在我看来 跨度的总宽度是根据填充大小而增加的 有没有办法防止跨度大小增加并将文本填充到右侧 不知道你的 padding
  • Linux 中的缓冲区和高速缓冲存储器有什么区别?

    对我来说 不清楚这两个 Linux 内存概念之间有什么区别 buffer and cache 我已读完这个帖子 https stackoverflow com questions 3192579 buffer and cache diffe
  • 在Python中将数组的数组转换为json[重复]

    这个问题在这里已经有答案了 我有一个数组数组 它 是从数据库查询中获取的SQL炼金术我想做两件事 我想获取列的名称 或类似的名称 从表中选择全名 AS 姓名 我想将最终产品转换为 json 对象数组 以便我可以在前端使用它 我已经搜索了几个
  • 将 .net 方法公开为 Excel 函数?

    我有一组计算方法位于 Net DLL 中 我想让 Excel 2003 用户可以使用这些方法 以便他们可以在电子表格中使用它们 例如我的 net方法 public double CalculateSomethingReallyComplex
  • 查找二进制中类符号的来源

    我有一个有趣的问题 我收到的崩溃日志引用了我的应用程序中名为 NRURLProtocol 的类 特别是在文件 NRURLProtocol m 中 根据崩溃日志 该日志存在于我的应用程序中 而不是存在于 iOS 框架中 但是 我的项目中没有
  • VSCODE 笔记本 - 是否可以仅显示大纲中的 Markdown 标题?

    我使用 Markdown 标题在笔记本中导航 但我也倾向于制作大量 非标题 Markdown 笔记 两者都出现在大纲中 随着笔记本变大 找到正确的标题变得相当困难 有没有办法抑制大纲中显示的普通降价单元格 我关注了 github 和 at
  • 如何将与字段关联的对象列表检索到实体类中?

    当我通过任何字段找到客户时 一切都很顺利 我得到了带有返回的全局对象的 JSON 我正在编写代码来查找Customer由于他们lastName 客户实体有一个对象 其中的字段lastName被宣布 因此 我希望我的端点像第一种情况一样返回客
  • 从 .NET 中的堆栈帧获取参数值?

    我希望能够从 NET中的堆栈帧中获取所有参数值 有点像在 Visual Studio 调试器中查看调用堆栈中的值的方式 我的方法集中于使用堆栈框架类 http msdn microsoft com en us library system