我有时无法从 Silverlight 中的方法获取方法名称
本文关键字:方法 获取 Silverlight | 更新日期: 2023-09-27 18:34:15
我有这个方法记录来自 Silverlight 客户端的错误:
[MethodImpl(MethodImplOptions.NoInlining)]
public static bool ErrorHandler(Exception error, bool showError = true)
{
string callingMethod = new StackFrame(1).GetMethod().Name;
//write log - call webservice
//show error that some error happened if showError is true
}
我的问题是,当我运行应用程序并调用一个引发异常的方法时,它会记录如下:
<ThrowExceptionMethod>b__72: test
但是,当具有正常(非开发人员运行时)的人运行此应用程序并引发异常时,它会记录如下:
b__72: test
我只是猜测这是由于SDK Silverlight运行时。这很难说,因为我的大多数同事都安装了 Silverlight SDK......有人可以确认这是否是这种异常的原因。
解决!
这不是由于SDK运行时,只是因为我调用了匿名方法。我在其中添加了以下代码行:
var listStackFrame = new List<StackFrame>();
for (int i = 1; i < 20; i++)
{
listStackFrame.Add(new StackFrame(i));
}
string callingMethod = string.Empty; //new StackFrame(1).GetMethod().Name;
foreach (var item in listStackFrame
.Where(m => m != null && m.GetMethod() != null && !string.IsNullOrEmpty(m.GetMethod().Name) && m.GetMethod().Name.Contains("__")))
{
callingMethod += item.GetMethod().Name + "->";
}
我不担心这会消耗多少资源,因为毕竟发生了异常,用户将停止他正在做的任何事情并联系支持人员。
这通常是因为你正在执行的实际上是收益率迭代器或匿名委托(可能还有其他我遗漏的情况)。发生的情况是,编译器实际上为大多数语法糖创建新方法甚至类。
我认为您可以迭代所有先前的方法调用,以查找第一个没有 [CompilerGenerated ] 属性的方法。
这对于开发机器和普通机器之间的区别是有意义的:
StackFrame 信息对于调试构建配置的信息量最大。默认情况下,调试版本包括调试符号,而发布版本不包含。调试符号包含构造 StackFrame 对象时使用的大部分文件、方法名称、行号和列信息。
这是来自StackFrame的文档。