2012-05-16 23 views
1
获得方法名

我有这样的方法,从Silverlight客户端记录错误:我有时无法从我的方法在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 + "->"; 
} 

我不担心这个多少钱吃起来的资源,因为所有的异常已发生之后,用户将停止一切他在做什么,联系技术支持。

回答

1

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

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

+0

这可能是真的,因为我们称之为web服务我们创建匿名方法来处理结果 – Rumplin

+1

我认为你可以检查创建10个StackFrames并查看最后10个方法。你会看到从那里得到的处理错误是有意义的。 – ivowiblo

+0

我用适合我的解决方案更新了我的问题。谢谢各位 – Rumplin

1

这是有道理的,一个开发和正常的机器之间的区别:

的StackFrame信息将是最翔实与调试生成配置。默认情况下,Debug版本包含调试符号,而Release版本则不包含。调试符号包含用于构建StackFrame对象的大部分文件,方法名称,行号和列信息。

这是从StackFrame的文档。

+0

是的,但是在我们的测试环境中,我们在发布模式下发布了解决方案,并且一些用户获得了某些方法的名称。但我想这是因为像ivowiblo提到的匿名方法/代表 – Rumplin