私はC#Windows Phoneアプリケーションから例外レポートを解釈しています。メソッドはNullReferenceException
をスローします。この方法は、行く:NullReferenceExceptionとMSILとの比較
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
がnullであることと一致だ - nullの可能性があることができますが他には何も単にありません。しかし、ここで不思議な部分があります。
例外オブジェクトのStackTrace
のStackFrame
のGetILOffset()
は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
もスローできますが、オブジェクトがnullの場合にのみthis
オブジェクトがスローされます。これはC#AFAIKでは不可能です。
ドキュメントでは、デバッグ情報がオフセットの途中に入るかもしれないと言いますが、リリースビルドです。
ILDASMで検査しているDLLは、XAPの一部としてWindows Phone Storeに出荷されたDLLです。
しかし、フィールドアクセス( 'ldfld')ではスローする必要がありません(' this'は 'null'ではないので)、' callvirt'です。分解を見て、私は並べ替えが原因だとは思わない。 – svick
フィールドアクセス/並べ替えでの公平な点ですが、マッピングの粒度を小さくすることで説明できると私は考えています。私は実際のマッピングを二重チェックして、結果に戻ってきます。 –
@svick、私は再現し、マッピングをチェックし、結果で更新しました。 –