gpt4 book ai didi

c# - 从 StackTrace 中过滤掉非用户代码方法

转载 作者:太空狗 更新时间:2023-10-29 21:09:42 25 4
gpt4 key购买 nike

我正在尝试实现更复杂的错误处理。为了实现我的目标,我需要从当前 StackTrace 中过滤掉非用户代码方法(框架)。

在 ASP.NET 中,典型的 StackTrace 正如您可能猜到的那样,有许多与调试目的完全无关的方法,因为它们在用户代码之外。 Visual Studio 为您提供了过滤掉这个非用户代码(框架)的选项,所以我猜这是可能的。然而,在探索 StackFrames(以及方法、模块、程序集……)的方法和属性大约 30 分钟后,我找不到任何可用于识别“系统”框架的东西。

我最终手动指定了我要记录的模块(模块是程序集的一部分,在我的例子中是 1:1)。

有没有更好的方法来做到这一点?只需包含核心 ASP.NET 之外的所有内容。

最佳答案

StackFrame类有 GetMethod()成员函数,来自检索 MethodBase对象。

如果您只需要一个简单的过滤器,您可以执行以下操作之一:

  • 去掉类中以“System”开头的所有方法。或“微软”。 (因为所有 .NET 库都放在那里)。
  • 找到方法所在的程序集(见前文)然后检查 AssemblyCompanyAttribute和由“Microsoft Corporation”制造的过滤器组件)。这比以前的方法要好,因为有时我看到库将自己的类型放在 System 中。命名空间。

如果您需要更多东西,您可以获取定义该方法的模块 ( MethodBase.Module)。现在您有两个选择:

  • 如果您的所有程序集都已签名,您只能显示具有该公钥 token 的方法(获取模块定义为 Module.Assembly 属性的程序集,使用 AssemblyName 构建一个 Assembly.FullName 对象,然后检查公钥AssemblyName.KeyPair 属性,它必须与您的公钥 token 匹配(只需与 GetExecutingAssembly() 进行比较)。
  • 如果不是所有的程序集都已签名,您可以执行相同的操作,但过滤掉所有与系统 程序集的公钥 token 匹配的程序集(这可能是最简单的情况,它将包括第 3 部分库也是如此)。

请注意,并非所有系统程序集都具有相同的公钥 token (即使在同一框架版本中),因此您必须收集并检查 key 列表(只需浏览 c:\windows\assembly 即可阅读)。一个好的方法可能是检查公钥,然后使用 AssemblyCompanyAttribute 应用第二个过滤器.

关于c# - 从 StackTrace 中过滤掉非用户代码方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13451622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com