大佬教程收集整理的这篇文章主要介绍了WinForms WebBrowser HtmlDocument.Write 在不同的解决方案中表现不同,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
最近,我的应用程序在尝试显示相当长(但很简单)的 HTML 电子邮件时崩溃了。 崩溃是由 msHTMl.dll 堆栈溢出(异常代码 0xc00000fd)引起的。这里需要注意的是,这并没有抛出异常,但它实际上只是使整个程序崩溃了。该错误是从 windows 事件日志中检索到的。
在调试过程中,我创建了一个较小的示例解决方案来尝试缩小问题的范围。然而,它不仅在示例解决方案中运行良好,而且即使对于最简单的 HTML 字符串运行相同的代码,它的行为也与主程序完全不同。
代码如下:
var webbrowser1 = new System.windows.Forms.Webbrowser();
webbrowser1.AllowNavigation = false;
webbrowser1.AllowWebbrowserDrop = false;
webbrowser1.Navigate("about:blank");
var doc = webbrowser1.document.openNew(true);
doc.Write("<HTML><BODY>This is a new HTML document.</BODY></HTML>");
var count = doc.All.Count;
var HTML = doc.All[0].outerHTML;
在示例解决方案中,它的计算结果为:
count = 4; // [HTML,head,@R_403_5979@,BODY]
HTML = "<HTML><head></head>\r\n<BODY>This is a new HTML document.</BODY></HTML>";
同时在主程序中它出现:
count = 3; // [HTML,BODY]
HTML = "<HTML><head></head><body>This is a new HTML document.</body></HTML>";
这些是很小的差异,但这主要是由于使用了简单的 HTML。导致崩溃的那个有相当显着的差异。
我对结果如何会有如此大的不同感到非常困惑。
HtmlDocument.Write(String) 的文档指出:
建议您使用 Write 方法编写完整的有效 HTML 文档,包括 HTML 和 BODY 标签。但是,如果您只编写 HTML 元素,文档对象模型 (DOM) 将为您提供这些元素。
但我不知道 Domdocument 是如何提供的,也不知道为什么它们首先会有所不同。这两种解决方案都在 x64 调试模式和 Net-Framework 4.6.2 下运行。
两者都加载模块:C:\windows\assembly\GAC\Microsoft.msHTML\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.msHTMl.dll
这些怎么可能产生不同的结果?! 欢迎任何和所有帮助。 提前致谢。
行为上的差异源于 Jimi 提出的注册表项和链接 here
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
重申一下,在上面的注册表中,主程序有一个条目 "ApplicationFilename.exe"=dword:00002af9
,而我的新测试应用程序没有。
这本身并不能解释 mshtml.dll 本身的崩溃,但由于问题是关于行为的差异,我将其作为答案发布。崩溃很可能与 Visual studio 使用的过时版本有关,但我还没有机会研究一些建议的修复方法。
以上是大佬教程为你收集整理的WinForms WebBrowser HtmlDocument.Write 在不同的解决方案中表现不同全部内容,希望文章能够帮你解决WinForms WebBrowser HtmlDocument.Write 在不同的解决方案中表现不同所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。