【问题标题】:I sometimes can't get the method name from my method in Silverlight我有时无法从 Silverlight 中的方法中获取方法名称
【发布时间】:2012-05-16 12:04:01
【问题描述】:

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

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

【问题讨论】:

    标签: c# silverlight reflection stack-frame getmethod


    【解决方案1】:

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

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

    【讨论】:

    • 这可能是真的,因为我们调用网络服务我们创建匿名方法来处理结果
    • 我认为您可以检查创建 10 个 StackFrames 并查看最后 10 个方法。您将看到从那里处理错误的意义所在。
    • 我用适合我的解决方案更新了我的问题。谢谢大家
    【解决方案2】:

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

    StackFrame 信息将在 Debug 构建配置中提供最多信息。默认情况下,Debug 版本包含调试符号,而 Release 版本不包含。调试符号包含构建 StackFrame 对象时使用的大部分文件、方法名称、行号和列信息。

    来自StackFrame 的文档。

    【讨论】:

    • 是的,但是在我们的测试环境中,我们以Release模式发布解决方案,有些用户得到的方法名有些没有。但我想这是因为提到了像 ivowiblo 这样的匿名方法/代表
    猜你喜欢
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多