【发布时间】:2016-04-17 21:03:50
【问题描述】:
我正在解释来自 C# Windows Phone 应用程序的异常报告。一个方法抛出一个NullReferenceException。方法是:
public void OnDelete(object o, EventArgs a)
{
if (MessageBox.Show(Res.IDS_AREYOUSURE, Res.IDS_APPTITLE, MessageBoxButton.OKCancel) == MessageBoxResult.OK)
m_Field.RequestDelete();
}
这与m_Field 为空是一致的——那里没有其他任何东西可以为空。但这是神秘的部分。
来自StackFrame 的GetILOffset() 来自StackTrace 的异常对象返回0x13。如 ILDASM 所示,该方法的 MSIL 为:
IL_0000: call string App.Res::get_IDS_AREYOUSURE()
IL_0005: call string App.Res::get_IDS_APPTITLE()
IL_000a: ldc.i4.1
IL_000b: call valuetype (...) System.Windows.MessageBox::Show(...)
IL_0010: ldc.i4.1
IL_0011: bne.un.s IL_001e
IL_0013: ldarg.0
IL_0014: ldfld class App.Class2 App.Class1::m_Field
IL_0019: callvirt instance void App.Class2::RequestDelete()
IL_001e: ret
这是我不明白的。如果偏移量确实是 0x13,则意味着 ldarg 行会导致异常。但是该命令被记录为没有引发任何异常。应该抛出的是callvirt,不是吗?或者是相对于方法开始以外的东西的偏移量? ldfld 也可以抛出,但前提是 this 对象为空;这在 C# AFAIK 中是不可能的。
文档提到调试信息可能会妨碍偏移,但它是发布版本。
我正在使用 ILDASM 检查的 DLL 正是我作为 XAP 的一部分发送到 Windows Phone 商店的那个。
【问题讨论】:
标签: c# windows-phone .net-assembly cil