我有时无法从Silverlight中的方法获取方法名称

时间:2012-05-16 12:04:02

标签: c# silverlight reflection stackframe getmethod

我有这种方法可以记录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 + "->";
}

我并不担心这会占用多少资源,因为毕竟发生了异常并且用户将停止他正在做的任何事情并联系支持。

2 个答案:

答案 0 :(得分:1)

这通常是因为你正在执行的实际上是一个yield迭代器或匿名委托委托(可能还有其他我缺席的情况)。发生的事情是编译器实际上为大多数语法糖创建了新方法甚至类。

我认为你可以迭代所有以前的方法调用,寻找没有[CompilerGenerated]属性的第一个。

答案 1 :(得分:1)

这对于dev和普通机器之间的区别是有意义的:

  

StackFrame信息将为Debug构建配置提供最丰富的信息。默认情况下,Debug构建包括调试符号,而Release构建则不包括。调试符号包含构造StackFrame对象时使用的大部分文件,方法名称,行号和列信息。

这是来自StackFrame的文档。