WinForms WebBrowser HtmlDocument.Write 在不同的解决方案中表现不同

WinForms WebBrowser HtmlDocument.Write behaves differently in different solutions

最近,我的应用程序在尝试显示相当冗长(但其他方面很简单)的电子邮件时崩溃了 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>\r\n<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(string) 的文档指出:

It is recommended that you write an entire valid HTML document using the Write method, including HTML and BODY tags. However, if you write just HTML elements, the Document Object Model (DOM) will supply these elements for you.

但我不知道 DomDocument 是如何提供的,也不知道为什么它们首先会有所不同。两种解决方案在 x64 调试模式和 Net-Framework 4.6.2 中都是 运行。 都加载模块:C:\WINDOWS\assembly\GAC\Microsoft.mshtml.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll

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

行为上的差异源于 Jimi 提出并链接的注册表项

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

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

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