65.9K
CodeProject 正在变化。 阅读更多。
Home

C#: WebBrowser vs Gecko vs Awesomium vs OpenWebKitSharp:如何选择和使用

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (38投票s)

2014 年 11 月 23 日

CPOL

3分钟阅读

viewsIcon

366676

downloadIcon

20019

4种浏览器引擎和控件的比较+一些使用技巧(包含在附件项目和提示文本中)。简洁明了。

Gecko & WebKit 示例正在构建中,但已可用,可作为良好的起点

它们都是什么?

WebBrowser

  • 默认的 .NET 浏览器引擎。
  • 基于 MSHTML + Active-X 控件,该控件基于 COM IWebBrowser2MSHTML+IWebBrowser2Internet Explorer 浏览器的主要组件。
  • 拥有不同的 Winforms 和 WPF 版本。

Gecko

  • 第三方浏览器引擎。
  • 基于 XULRunner,用于 Firefox 浏览器。
  • 仅有Winforms版本。

警告!此提示完全仅适用于非常非常旧的 Gecko 版本(1.9)。我将在稍后更新为更新、更强大的版本(可能为 10.*..29.*)。

Awesomium WebControl

  • 第三方浏览器控件,具有外部可定制的核心
  • 基于 .NET Awesomium 核心封装,该封装基于 Awesomium 核心,而 Awesomium 核心基于修改后的Chromium(或 WebKit)引擎。
  • 拥有不同的 Winforms, WPF, Mono 版本。

OpenWebKitSharp

  • 第三方浏览器引擎。
  • 基于 WebKit 引擎,用于SafariChromium 浏览器。
  • 仅有Winforms版本。

EO.WebBrowser

  • 第三方浏览器引擎。
  • 基于Chromium项目。
  • 拥有Winforms和 WPF版本。

哪个更好?

没有!编程语言、框架、引擎通常只会在特定目的下“更好”。

您可以定义您的目标,权衡下表中列出的引擎的优缺点,然后选择最适合您的引擎。

提示:此提示的宽度非常大。表格可能无法完全显示在浏览器窗口中。如果您使用固定布局,建议将其更改为流式布局
改回固定布局.

  WebBrowser Gecko Awesomium OpenWebKitSharp EO.WebBrowser
许可证 免费。闭源 免费。开源:MPL 1.1/GPL 2.0/LGPL 2.1 如果您的收入 up
高达 10 万美元(或花费 2900 美元)则免费。
闭源
免费。开源 带有通知广告的免费试用版。闭源
操作系统/平台 Winforms, WPF Winforms Winforms, WPF 跨平台
Unity, Mono, SDL
Winforms. 跨平台:? Winforms, WPF
CPU Any CPU ? x86 ? Any CPU
页面加载速度 低功耗 中等(?)。创建控件时可能会冻结窗体几秒钟
所需 DLL 文件大小 0 MB(包含在 Windows 中) 22.4 MB 40.5 MB 64.6 MB ?
页面加载时
不冻结 GUI
是,除了第一次加载
最低 .NET 版本 .NET 2.0 或更旧版本 .NET 2.0 或更旧版本 .NET 4.0 ? ?

对象、方法、属性模型

- 与 WebBrowser 相同 与 WebBrowser 不同 与 WebBrowser 相同,但非常不完善,许多方法和属性无法工作! ?
DOM 操作 - 设置 HTML 仅通过 Js ?
DOM 操作 - 获取 HTML 是,但无法处理
禁用的 JS!另外,有一个 bug,请使用 JS 模拟 - document.documentElement.
outerHTML
仅通过 Js ?
DOM - GetElementById 仅通过 Js ? ?
DOM - GetElementsByClassName 仅通过 Js 仅通过 Js ? ?
DOM - GetElementsByTagName 仅通过 Js ? ?
注入 + 执行 / 执行 Js 注入 + 执行 是,在新版本中 Exec Exec ?
禁用 Js 否,仅在所有 IE 级别生效 ? ?
设置代理 否,仅在所有 IE 级别生效 ? ?
开发 - 内置 Visual HTML Builder ? ?
开发 - HTML 代码语法高亮查看器 ? ?
开发 - HTML 代码可视化检查器和编辑器 ?
内置下载管理器 ? ? ? ?

WebBrowser 使用和技巧

内置 Visual HTML 编辑器

如何启用它

webBrowser1.Document.DomDocument.GetType().GetProperty("designMode").SetValue
    (webBrowser1.Document.DomDocument, "On", null);

如何以编程方式粘贴 HTML 元素

// appends:
// <a id="mylink" href="http://codeproject.com/">
//   <img id="myimg" 
//    src="http://dj9okeyxktdvd.cloudfront.net/App_Themes/CodeProject/Img/logo250x135.gif" />
// </a>

var mylink = webBrowser1.Document.CreateElement("a");
mylink.Id = "mylink";
mylink.SetAttribute("href", "http://codeproject.com/");
             
var myimg = webBrowser1.Document.CreateElement("img");
myimg.Id = "myimg";
myimg.SetAttribute("src", 
"http://dj9okeyxktdvd.cloudfront.net/App_Themes/CodeProject/Img/logo250x135.gif");
mylink.AppendChild(myimg);
webBrowser1.Document.Body.AppendChild(mylink); 

DOM 元素选择 - GetElementById

var id = "mylink";

var el = webBrowser1.Document.GetElementById(id);
if (el != null)
{
    MessageBox.Show("Element with id=\"" + id + "\" has innerHTML: " + el.InnerHtml);
}
else
{
    MessageBox.Show("Element with id=\"" + id + "\" not found.");
}

DOM 元素选择 - GetElementsByTagName

var tag = "img";

var elz = webBrowser1.Document.GetElementsByTagName(tag);
if (elz.Count > 0)
{
    MessageBox.Show(elz.Count + " elements with tag <" + tag + "> found.");
}
else
{
    MessageBox.Show("No elements with tag <" + tag + "> found.");
}

DOM 内容操作 - 设置 HTML

webBrowser1.DocumentText = "<html><head><script>alert('check!');
</script></head><body>lorem</body></html>";

注入 + 执行 Js

var head = webBrowser1.Document.GetElementsByTagName("head")[0];

var scriptEl = webBrowser1.Document.CreateElement("script");
scriptEl.SetAttribute("text", "function sayHello() { alert('hello') }");
head.AppendChild(scriptEl);

webBrowser1.Document.InvokeScript("sayHello");

Gecko 使用和技巧

DOM 内容操作 - 设置 HTML

geckoWebBrowser1.Document.DocumentElement.InnerHtml = 
"<html><head></head><body>
<a class=\"link\">f</a></body></html>";

DOM 元素选择 - GetElementsByClassName

(geckoWebBrowser1.Document.GetElementsByClassName("link")[0] as 
    Skybound.Gecko.GeckoElement).InnerHtml = "tt";

Awesomium WebControl 使用和技巧

DOM 内容操作 - 设置 HTML

webControl1.HTML = "<html><head><script>alert
('check!');</script></head><body>lorem</body></html>";

DOM 内容操作 - 获取 HTML

var allhtml = webControl1.ExecuteJavascriptWithResult
    ("document.documentElement.outerHTML");

执行 Js

webControl1.ExecuteJavascript
("document.body.innerHTML += '<i>Hello, World!</i>';");

禁用 Js

var ws = WebCore.CreateWebSession(new WebPreferences() { Javascript = true });
webControl1 = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
this.Controls.Add(webControl1);

设置代理

var ws = WebCore.CreateWebSession(new WebPreferences() 
{ ProxyConfig = "255.255.255:8080" });
webControl1 = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
this.Controls.Add(webControl1);

OpenWebKitSharp 使用和技巧

DOM 内容操作 - 设置 HTML

webKitBrowser1.GetScriptManager.EvaluateScript("document.body.innerHTML='';");
© . All rights reserved.