Click here to Skip to main content
15,888,100 members
Articles / DevOps / Automation
Tip/Trick

C#: WebBrowser vs Gecko vs Awesomium vs OpenWebKitSharp: What To Choose And How to Use

Rate me:
Please Sign up or sign in to vote.
4.90/5 (38 votes)
1 Feb 2015CPOL3 min read 357.5K   19.8K   84   32
Comparison of 4 browser engines and controls + some tips for using them (in attached projects and in tip text). Short and clear.

Gecko & WebKit samples are under construction now, but are already working and may be used as a good start:

Who is Who?

WebBrowser

  • Default .NET browser engine.
  • Based on MSHTML + Active-X control based on COM IWebBrowser2. MSHTML+IWebBrowser2 are main components of Internet Explorer browser.
  • Has different Winforms and WPF ports.

Gecko

  • Third-party browser engine.
  • Based on XULRunner used in Firefox browser.
  • Has Winforms version only.

Warning! This tip is fully actually only for very, very old Gecko version (1.9). I'll change it to a newer and more powerful version (10.*..29.* probably), a bit later.

Awesomium WebControl

  • Third-party browser control with external customizable core.
  • Based on .NET Awesomium core wrapper based on Awesomium core based on modified Chromium (or WebKit) engine.
  • Has different Winforms, WPF, Mono ports.

OpenWebKitSharp

  • Third-party browser engine.
  • Based on WebKit engine used in Safari and Chromium browsers.
  • Has Winforms version only.

EO.WebBrowser

  • Third-party browser engine.
  • Based on Chromium project.
  • Has Winforms and WPF ports.

Who is Better?

Nobody! Programming language, framework, engine usually may be better only for a particular purpose.

You can define your objectives, weigh the pros and cons of engines listed in the table below, and select the engine, the best for you.

Tip: This tip has an extremely large width. Table can be not placed in browser window. If you use a fixed layout, it's recommended to change it to fluid.
Change it back to fixed.

  WebBrowser Gecko Awesomium OpenWebKitSharp EO.WebBrowser
License Free. Proprietary Free. Open-source: MPL 1.1/GPL 2.0/LGPL 2.1 Free if your revenue up
to $100K (or costs $2900).
Proprietary
Free. Open-source Free trial version with notification ads. Proprietary
OS/Platforms Winforms, WPF Winforms Winforms, WPF Cross-platform:
Unity, Mono, SDL
Winforms. Cross-platform: ? Winforms, WPF
CPU Any CPU ? x86 ? Any CPU
Page loading speed Low Medium (?). Control can freezing the form for few seconds on its create High High High
Required dlls size 0 MB (included in Win) 22.4 MB 40.5 MB 64.6 MB ?
Not freezing GUI
when page loads
No No Yes No Yes, excepts a 1st load
Minimal .NET Version .NET 2.0 or more older .NET 2.0 or more older .NET 4.0 ? ?

Object, method, property model

- WebBrowser-identical Not WebBrowser-identical WebBrowser-identical, but very unfinished, many methods and properties not working! ?
DOM manipulate - set HTML Yes Yes Yes Via Js only ?
DOM manipulate - get HTML Yes Yes Yes, but don't work with
disabled JS! Also, there is a bug, use JS analogue -
document.documentElement.<br />
			outerHTML
Via Js only ?
DOM - GetElementById Yes Yes Via Js only ? ?
DOM - GetElementsByClassName Via Js only Yes Via Js only ? ?
DOM - GetElementsByTagName Yes Yes Via Js only ? ?
Inject + exec / exec Js Inject + exec Yes, in newer versions Exec Exec ?
Disable Js No, only on all-IE level Yes Yes ? ?
Set proxy No, only on all-IE level Yes Yes ? ?
Dev - Built-in Visual HTML Builder Yes ? No No ?
Dev - HTML code syntax-hl viewer No ? Yes Yes ?
Dev - HTML code Visual Inspector & Editor No ? No Yes Yes
Built-in download manager ? ? ? Yes ?

WebBrowser Usage and Tricks

Built-in Visual HTML Editor

How to enable it:

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

How to paste HTML element programmatically:

C#
// 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 element selection - GetElementById

C#
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 element selection - GetElementsByTagName

C#
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 content manipulate - set HTML

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

Inject + exec Js

C#
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 Usage and Tricks

DOM content manipulate - set HTML

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

DOM element selection - GetElementsByClassName

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

Awesomium WebControl Usage and Tricks

DOM content manipulate - set HTML

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

DOM content manipulate - get HTML

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

Exec Js

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

Disable Js

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

Set proxy

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

OpenWebKitSharp Usage and Tricks

DOM content manipulate - set HTML

C#
webKitBrowser1.GetScriptManager.EvaluateScript("document.body.innerHTML='';");

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Comments and Discussions

 
GeneralRe: Coherent UI .Net Pin
nishantcop12-Jan-15 23:01
nishantcop12-Jan-15 23:01 
QuestionWhat about 64 bit support? Pin
i0028-Dec-14 3:30
i0028-Dec-14 3:30 
AnswerRe: What about 64 bit support? Pin
Emiliarge28-Dec-14 5:42
professionalEmiliarge28-Dec-14 5:42 
AnswerRe: What about 64 bit support? Pin
ISanti29-Dec-14 3:29
ISanti29-Dec-14 3:29 
QuestionActually, there's a definitive answer to who is better Pin
Marc Clifton19-Dec-14 11:45
mvaMarc Clifton19-Dec-14 11:45 
AnswerRe: Actually, there's a definitive answer to who is better Pin
Luka19-Dec-14 13:05
Luka19-Dec-14 13:05 
GeneralRe: Actually, there's a definitive answer to who is better Pin
Marc Clifton19-Dec-14 13:40
mvaMarc Clifton19-Dec-14 13:40 
AnswerRe: Actually, there's a definitive answer to who is better Pin
ISanti29-Dec-14 3:05
ISanti29-Dec-14 3:05 
Actually, there's a definitive answer for me: combine NET WebBrowser controls with MSTHML library (WebBrowser for Windows Forms control is more complete than the WPF control)

First, NET Webbrowsers use by default the installed IE, which may be any until IE11 (not only IE7 and no need to modify registry keys).

Second is easy to get a hook to MSHTML from NET WebBrowser and this library contains a real API to manipulate the HTML DOM from C#. The rest of alternatives (based on WebKit), have no API for direct DOM access, but do so through JavaScript. In other words, they have no API but an intermediate language, which in turn has an API to handle HTML DOM. And from my experience, that bridge unnecessarily complicates programming and has a low performance (WebBrowser controls can also optionally use and intercept javascript, so they are the only alternative that offers both possibilities)

Third, IE is getting faster from IE9, and I believe IE11 loads pages at a rate very similar to its competitors.

I use NET WebBrowsers/MSHTML combination whenever I can, and there is just only one issue that forces me to use Awesomium occasionally: When I have to overlap WPF controls over the WebBrowser surface (and that's when I realize how complicated and inefficient is using an intermediate language rather than an API).
Sorry for my bad English

QuestionPossibility Pin
Nelek24-Nov-14 21:55
protectorNelek24-Nov-14 21:55 
AnswerRe: Possibility Pin
Emiliarge24-Nov-14 22:50
professionalEmiliarge24-Nov-14 22:50 
GeneralRe: Possibility Pin
Nelek24-Nov-14 23:06
protectorNelek24-Nov-14 23:06 
SuggestionShow the differences in a table instead. Pin
SoMad23-Nov-14 10:59
professionalSoMad23-Nov-14 10:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.