Я установил IE 9 на прошлой неделе, и с тех пор мое приложение С#.net падает примерно в 20% случаев. Отладчик не может показать что-то полезное, кроме остановки в Program.cs Application.Run(новый MyMainForm());, Кстати, основная форма уже была показана, так что это не то, что это что-то в конструкции на основной форме.
У меня Windows7.
The exception thrown is:
"An unhandled exception of type 'System.ArgumentException' occurred in System.Windows.Forms.dll
Additional information: Value does not fall within the expected range.
Снимок экрана вызова → http://img861.imageshack.us/f/ie9v.png/
При работе за пределами отладчика эта информация отображается:
Problem signature:
Problem Event Name: APPCRASH
Application Name: myexe.exe
Application Version: 6.7.6.0
Application Timestamp: 4d7fdffd
Fault Module Name: mshtml.dll
Fault Module Version: 9.0.8112.16421
Fault Module Timestamp: 4d76266c
Exception Code: c0000005
Exception Offset: 0012c848
OS Version: 6.1.7600.2.0.0.256.48
Locale ID: 1037
And sometimes instead of mshtml.dll it says StackHash_f09d
Problem Event Name: APPCRASH
Application Name: myexe.exe
Application Version: 6.7.6.0
Application Timestamp: 4d7fdffd
Fault Module Name: StackHash_f09d
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Code: c0000005
Exception Offset: 00000000
OS Version: 6.1.7600.2.0.0.256.48
Locale ID: 1037
Заранее спасибо
Отредактировано:
То, что я вижу в windbg, с символами:
0:000> kb
ChildEBP RetAddr Args to Child
0020eda4 64d54f83 0566c988 00001012 00000000 mshtml!CDoc::ReduceMemoryPressureTask+0x1a
0020edb4 64d54f2c c6b991e4 0020ee78 00000113 mshtml!GWYieldToMsgOnCurrentThread+0x17b
0020edfc 770086ef 00192392 00000012 0000201b mshtml!GlobalWndProc+0x1f2
0020ee28 77008876 64d54afe 00192392 00000113 USER32!InternalCallWinProc+0x23
0020eea0 770089b5 00000000 64d54afe 00192392 USER32!UserCallWinProcCheckWow+0x14b
0020ef00 77008e9c 64d54afe 00000000 0020ef2c USER32!DispatchMessageWorker+0x35e
0020ef10 03b54726 0020ef9c fa69a961 00000000 USER32!DispatchMessageW+0xf
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v2.0.50727_32\System.Windows.Forms\f92c882fd4e7005c005e208daa04c28d\System.Windows.Forms.ni.dll
WARNING: Frame IP not in any known module. Following frames may be wrong.
0020ef2c 5af78aee 01b743e4 00000001 01ac95cc 0x3b54726
0020efe0 5af78757 00000000 ffffffff 00000000 System_Windows_Forms_ni+0x208aee
0020f038 5af785a1 01b6c610 1f3a000e 00000000 System_Windows_Forms_ni+0x208757
0020f068 5af35911 01bb7d84 0020f10c 003b73d8 System_Windows_Forms_ni+0x2085a1
0020f0e0 6f221b5c 015b1141 00000001 0020f170 System_Windows_Forms_ni+0x1c5911
0020f0f0 6f232209 0020f1c0 00000000 0020f190 mscorwks!CallDescrWorker+0x33
0020f170 6f246511 0020f1c0 00000000 0020f190 mscorwks!CallDescrWorkerWithHandler+0xa3
0020f2b4 6f246544 0032c040 0020f380 0020f34c mscorwks!MethodDesc::CallDescr+0x19c
0020f2d0 6f246562 0032c040 0020f380 0020f34c mscorwks!MethodDesc::CallTargetWorker+0x1f
0020f2e8 6f2b0c45 0020f34c d847bc11 00000000 mscorwks!MethodDescCallSite::CallWithValueTypes+0x1a
0020f44c 6f2b0b65 003239c0 00000001 0020f488 mscorwks!ClassLoader::RunMain+0x223
0020f6b4 6f2b10b5 00000000 d847b3d9 00000001 mscorwks!Assembly::ExecuteMainMethod+0xa6
0020fb84 6f2b129f 013a0000 00000000 d847b389 mscorwks!SystemDomain::ExecuteMainMethod+0x456
===== UPDATE (я не уверен, если я должен опубликовать его как "Отвечать на ваш вопрос" ) ============ Спасибо всем, кто пытается помочь, я ценю это.
Будучи отчаянным, я начал удалять фрагменты кода, чтобы понять, какая часть моего кода влияет на него (мы используем управление веб-браузером во многих формах). После удаления вызова в LoginForm, который также использует управление веб-браузером, проблема исчезла.
В форме входа в систему находится элемент управления веб-браузером, он переходит к определенному URL-адресу, например /login.php, и если пользователь уже зарегистрирован, метод UserLoggedIn внутри формы вызывается из html с помощью ObjectForScripting. Когда был вызван UserLoggedIn, мы вызывали Close(), чтобы закрыть форму, если была показана LoginForm. Несмотря на то, что LoginForm все это делал, мы не всегда показывали его. Мы были, показывая это, только если после X секунд UserLoggedIn() не был вызван (то есть пользователь должен войти в систему). По какой-то причине и благодаря MS для того, чтобы мы могли отлаживать источники .net, когда мы вызывали Close, а форма не была видимой, она фактически удаляла форму и все ее дочерние элементы, потому что IsHandleCreated был ложным. Теперь Close вызывается из UserLoggedIn(), который является событием, запущенным с помощью элемента управления браузера (callstack показывает ieframe.dll, mshtml.dll и т.д.), Поэтому объект webbrowser был уничтожен при вызове. Хакерный способ решить эту проблему состоял в том, чтобы вызвать Close, только если форма была видимой. BTW, я не знаю, почему IsHandleCreated является ложным, если мы не показываем форму. Я попытался воспроизвести его, написав образец, который создает форму, которая не показана, но IsHandleCreated имеет значение true.
---- из Forms.cs -----
public void Close()
{
if (GetState(STATE_CREATINGHANDLE))
throw new InvalidOperationException(SR.GetString(SR.ClosingWhileCreatingHandle, "Close"));
if (IsHandleCreated) {
closeReason = CloseReason.UserClosing;
SendMessage(NativeMethods.WM_CLOSE, 0, 0);
}
else{
// MSDN: When a form is closed, all resources created within the object are closed and the form is disposed.
// For MDI child: MdiChildren collection gets updated (VSWhidbey# 368642 & 93550)
Dispose(); // THIS WAS CALLED WHEN FORM WAS NOT VISIBLE
}
}