30 Stimmen

Anwendung, die das WebBrowser-Steuerelement verwendet, stürzt nach der Installation von IE9 ab

Ich habe IE 9 letzte Woche installiert und seitdem stürzt meine c# .net-Anwendung etwa 20% der Zeit ab. Der Debugger ist nicht in der Lage, etwas Nützliches zu zeigen, außer bei Program.cs Application.Run(new MyMainForm()); zu stoppen, btw das Hauptformular wurde bereits angezeigt, so dass es nicht, dass es etwas im Bau auf Hauptformular ist.

Ich habe 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.

Bildschirmfoto des Aufrufstapels -> http://img861.imageshack.us/f/ie9v.png/

Bei der Ausführung außerhalb des Debuggers wird diese Information angezeigt:

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

Vielen Dank im Voraus

Bearbeitet:

Das ist es, was ich in windbg sehe, mit Symbolen:

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(Ich bin mir nicht sicher, ob ich es als "Antwort auf Ihre Frage" posten soll)============ Vielen Dank an alle, die zu helfen versuchen, ich weiß es zu schätzen.

Da ich verzweifelt war, begann ich, Codestücke zu entfernen, um zu verstehen, welcher Teil meines Codes sich darauf auswirkt (wir verwenden die Webbrowser-Steuerung in vielen Formularen). Nach dem Entfernen des Aufrufs an LoginForm, die auch Webbrowser-Steuerelement verwendet, verschwand das Problem.

Das Anmeldeformular beherbergt ein Webbrowser-Steuerelement, das zu einer bestimmten URL navigiert, z. B. /login.php, und wenn der Benutzer bereits angemeldet ist, wird die Methode UserLoggedIn innerhalb des Formulars von html mit ObjectForScripting aufgerufen. Wenn UserLoggedIn aufgerufen wurde, riefen wir Close() auf, um das Formular zu schließen, wenn das LoginFormular angezeigt wurde. Obwohl LoginForm all dies tat, wurde es nicht immer angezeigt. Wir haben es nur angezeigt, wenn nach X Sekunden UserLoggedIn() nicht aufgerufen wurde (d.h. der Benutzer muss sich anmelden). Aus irgendeinem Grund, und dank MS, dass wir in der Lage sind, in den .net-Quellen zu debuggen, wenn wir Close aufrufen und das Formular nicht sichtbar ist, wurde das Formular und alle seine Kinder tatsächlich entsorgt, weil IsHandleCreated falsch war. Nun, die Close wurde von UserLoggedIn(), die ein Ereignis von der Browser-Steuerelement (der Callstack zeigt ieframe.dll, mshtml.dll usw.) abgefeuert wird, aufgerufen, so dass das Webbrowser-Objekt zerstört wurde, während von aufgerufen wird. Die hacky Weg, um dies zu lösen, war zu schließen, nur aufrufen, wenn Form sichtbar war. BTW, ich weiß nicht, warum IsHandleCreated falsch ist, wenn wir das Formular nicht anzeigen. Ich habe versucht, es zu reproduzieren, indem ich ein Beispiel geschrieben habe, das ein Formular erstellt, das nicht angezeigt wird, aber dessen IsHandleCreated wahr ist.

---- von 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
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X