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, TITLE, BODY]
html = "<HTML><HEAD></HEAD>rn<BODY>This is a new HTML document.</BODY></HTML>";

同时,在主程序中,它显示为:

count = 3; // [HTML, HEAD, BODY]
html = "<html><head></head><body>This is a new HTML document.</body></html>";

这些差异很小,但主要是由于使用了简单的HTML。导致崩溃的原因有相当显著的差异。

我完全不明白为什么结果会有如此大的不同。

HtmlDocument.Write(字符串(的文档指出:

建议您使用write方法编写整个有效的HTML文档,包括HTML和BODY标记。但是,如果您只编写HTML元素,文档对象模型(DOM(将为您提供这些元素。

但我不知道DomDocument是如何提供的,也不知道为什么它们一开始会有所不同。这两个解决方案都在x64调试模式和Net Framework 4.6.2下运行。两者均加载模块:C:WINDOWSassemblyGACMicrosoft.mshtml7.0.3300.0__b03f5f7f11d50a3aMicrosoft.mshtml.dll

这些怎么可能产生不同的结果?!欢迎任何帮助。提前谢谢。

行为的差异源于Jimi提出的注册表项,并链接到此处

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION

重申一下,在上面的注册表中,主程序有一个条目"ApplicationFileName.exe"=dword:00002af9,而我的新测试应用程序没有。

这本身并不能解释mshtml.dll本身的崩溃,但由于问题是关于行为的差异,我将把它作为答案发布。这次崩溃很可能与Visual Studio使用的过时版本有关,但我还没有机会研究一些建议的修复方法。

相关内容

最新更新