Подтвердить что ты не робот

Приложение, использующее сбой управления WebBrowser после установки IE9

Я установил 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
        }
    }
4b9b3361

Ответ 2

Образованные спекуляции, чтобы вы начали использовать таймеры потоков потоков, которые являются MTA. Если бы я должен был догадаться, я бы сказал, что это может быть связано с этим, так как элементы управления activex могут быть безопасно созданы из потоков STA. Возможно, попробуйте создать поток вручную, а не использовать поток таймера?

Ответ 3

browser.Navigate( "xxx" ) вызывается из таймера

Какой таймер вы используете? Если обратный вызов по таймеру происходит в другом потоке, и вы вызываете методы в объекте браузера, то вы открываете себе случайное случайное падение. Попробуйте установить Control.CheckForIllegalCrossThreadCalls = true; в вашем методе Main() будет выполняться метод Application.Run(...) и посмотреть, если при сбое вы получите сообщение об ошибке "on point" или то же самое.

Ответ 4

Код исключения c0000005 обычно означает, что это проблема с памятью. Возможно, это связано с тем, что 32 и 64 бита области вашего приложения запутались. Я попытался бы полностью запустить приложение в 64, а затем полностью 32, посмотреть, что произойдет. Попробуйте запустить как admin, посмотрите, не изменило ли это что-либо. Также вы должны поместить try catch в те точки, где это имеет смысл, и rety всякий раз, когда ошибка обнаружена. Хорошо, это предложения, поэтому попробуйте и посмотрите, сможете ли вы получить дополнительную информацию.

Удачи!

Ответ 5

Этот сбой происходит, когда jscript.dll неправильно зарегистрирован. Метод ReduceMemoryPressureTask ожидает, что он будет загружен и в противном случае вызывает нулевое разыменование. Исправить - запустить regsvr32 jscript.dll на зараженном компьютере. Вы можете проверить наличие ошибки, просмотрев список загруженных модулей, чтобы увидеть, отсутствует ли jscript.dll или нет. Это можно сделать либо программно, либо через Process Explorer.

Ответ 7

Возможно, причина в том, что WinForms работает под управлением STA, но для веб-браузера требуется MTA. Поместите try-catch над контролем браузера, а также проверьте, есть ли доступ к r/w-доступу. Как указано oakcool

Ответ 8

Я столкнулся с проблемами, связанными с этим, в основном из-за нарушений привилегий.
Программа работала на уровне администратора, и браузер работал на уровне пользователя, или наоборот. Что-то посмотреть в

Ответ 9

Я получаю ту же ошибку/сбой, так как я получил установленный ie9. это происходит только всякий раз, когда на странице есть фильм с YouTube. чем он висит/падает с тем же самым окном, что и вы получаете Jack Juiceson.

но за именем "Fault Module Name" я не получаю файл mshtml.dll, я получаю d3d9.dll или что-то в этом роде. veryyyyyy odd.