Jac*_*son 30 .net c# webbrowser-control winforms internet-explorer-9
我上周安装了IE 9,因此,我的c#.net应用程序崩溃了大约20%.除了在Program.cs Application.Run(new 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.
Run Code Online (Sandbox Code Playgroud)
callstack的屏幕截图 - > 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
Run Code Online (Sandbox Code Playgroud)
提前致谢
编辑:
这就是我在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
Run Code Online (Sandbox Code Playgroud)
=====更新(我不确定,如果我应该将其发布为"回答您的问题")============感谢大家试图提供帮助,我很感激.
绝望之下,我开始删除代码片段以了解我的代码的哪一部分会影响它(我们以多种形式使用webrowser控件).删除对也使用webrowser控件的LoginForm调用后,问题就消失了.
登录表单托管webrowser控件,它导航到某个url,例如/login.php,如果用户已经登录,则使用ObjectForScripting从html调用方法UserLoggedIn里面的表单.当调用UserLoggedIn时,如果显示LoginForm,我们调用Close()来关闭表单.即使LoginForm正在做这一切,我们并不总是显示它.我们只是在X秒后没有调用UserLoggedIn()(即用户需要登录)时显示它.出于某种原因,并且由于MS使我们能够调试到.net源代码,当我们调用Close时,表单不可见,它实际上是处理表单及其所有子项,因为IsHandleCreated是错误的.现在,从UserLoggedIn()调用Close,这是一个由浏览器控件触发的事件(callstack显示ieframe.dll,mshtml.dll等),因此webbrowser对象在被调用时被驱逐.解决这个问题的愚蠢方法是,只有在表单可见时才调用Close.顺便说一句,我不知道,如果我们不显示表格,为什么IsHandleCreated是假的.我尝试通过编写一个创建表单的示例(未显示)来重现它,但它的IsHandleCreated是真的.
----来自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
}
}
Run Code Online (Sandbox Code Playgroud)
有根据的推测可以帮助您入门 - 计时器使用线程池线程,即 MTA。如果我不得不猜测,我会说它可能与此有关,因为 Activex 控件只能从 STA 线程安全地实例化。也许尝试手动创建线程而不是使用计时器线程?
归档时间: |
|
查看次数: |
10062 次 |
最近记录: |