Click here to Skip to main content
15,867,835 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 356.2K   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

 
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 
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 
I am not telling that is not possible to approve it.

I am just telling that is better to host it in CP, so that is for sure that the download is always available for the life time of the article.

I just gave you information about where you can ask if you get problems another time.
Emiliarge wrote:
I can remove this link now

I don't think is needed. If you are going to update the article in near future, you can try it then.
M.D.V. Wink | ;)

If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
Rating helpful answers is nice, but saying thanks can be even nicer.

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.