我有一个在用户计算机上崩溃的WinForms .NET应用程序。 Windows错误报告称它是一个System.NullReferenceException。
使用本页面上的说明(http://blogs.msdn.com/b/oanapl/archive/2009/01/30/windows-error-reporting-wer-and-clr-integration.aspx)后,我能够确定在Form.Dispose(boolean)中发生的问题。
但是,由于.Dispose()方法是.NET的一部分而不是我写的东西,有什么方法可以阻止它再次发生?我目前无法重现该问题,因为我不确切知道要重现它的步骤。
如果有人对如何弄清楚这个问题的更多细节有任何见解,我将不胜感激。
编辑: 要清楚,我不是在调用。直接使用,而是在代码中调用.Close()。
下面是Windows错误报告信息,后面是我按照上面发布的链接中的说明获得的windbg的输出。
如果我正确读到这个问题,问题出现在.Dispose()中,但也许我误读了输出?
Problem Event Name: CLR20r3
Problem Signature 01: MyApp.exe
Problem Signature 02: 0.0.0.0
Problem Signature 03: 52fd3d6b
Problem Signature 04: MyApp
Problem Signature 05: 0.0.0.0
Problem Signature 06: 52fd3d6b
Problem Signature 07: 35b
Problem Signature 08: b5
Problem Signature 09: System.NullReferenceException
0:013> !token2ee MyApp 06000035
Module: 000007fe98762f98
Assembly: MyApp.exe
Token: 0000000006000035
MethodDesc: 000007fe98a75220
Name: MyApp.Form_ColumnEditing.Dispose(Boolean)
JITTED Code Address: 000007fe98a159e0
0:013> !dumpil 000007fe98a75220
ilAddr = 00000000012c3a70
IL_0000: nop
IL_0001: ldarg.1
IL_0002: brfalse.s IL_000f
IL_0004: ldarg.0
IL_0005: ldfld MyApp.Form_ColumnEditing::components
IL_000a: ldnull
IL_000b: ceq
IL_000d: br.s IL_0010
IL_000f: ldc.i4.1
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: brtrue.s IL_0022
IL_0014: nop
IL_0015: ldarg.0
IL_0016: ldfld MyApp.Form_ColumnEditing::components
IL_001b: callvirt System.IDisposable::Dispose
IL_0020: nop
IL_0021: nop
IL_0022: ldarg.0
IL_0023: ldarg.1
IL_0024: call System.Windows.Forms.Form::Dispose
IL_0029: nop
IL_002a: ret