用更好的浏览器代替.NET WebBrowser控件,比如Chrome?

是否有任何相对简单的方法来将现代浏览器插入到.NET应用程序中?

据我所知, WebBrowser控件是IE的包装 ,除了它看起来是一个非常旧的IE版本,这不会是一个问题,所有这一切都需要在CSS拧紧,潜在的安全性风险(如果渲染引擎没有打补丁,我真的可以期望缓冲区溢出问题得到解决吗?)和其他问题。

我正在使用Visual Studio C# (快速版 – 这有什么区别?)

我想在我的应用程序中集成一个好的网页浏览器。 在某些情况下,我只是用它来处理用户注册过程,与我的一些网站的功能和其他顺序的接口,但我有另一个应用程序,需要更多的错误控制。

我需要:

  • 一个浏览器,可以集成在我的应用程序窗口(而不是一个单独的窗口)
  • 很好的支持CSS,JS和其他网络技术,与任何现代浏览器一样
  • 基本的浏览器功能,如“导航”,“后退”,“重新加载”…
  • 自由访问页面代码和输出。

我在考虑Chrome,因为它属于BSD许可证,但是对于最近版本的IE,我会感到满意。

尽可能地,我想保持简单。 最好的情况是,如果可以修补现有的WebBrowser控件,这个控件已经达到了我所需要的约70%,但我认为这是不可能的。

我已经找到了一个Mozilla的ActiveX控件( http://www.iol.ie/~locka/mozilla/control.htm ),但看起来它是一个旧版本,所以它不一定是一个改进。

我很乐意提供建议

Checkout CefSharp .Net绑定,我开始的一个项目,很幸运的被社区所接受,变成了一些美好的东西。

该项目包装了Chromium嵌入式框架 ,并已在许多重大项目中使用,包括Rdio的Windows客户端,Windows Messenger的Facebook Messenger和Windows的Github。

它具有用于WPFWinforms的浏览器控件,并具有大量的功能和扩展点。 基于铬也是快速起泡。

从NuGet中获取: Install-Package CefSharp.WpfInstall-Package CefSharp.WinForms

看看例子,并给你的想法/反馈/拉请求: https : //github.com/cefsharp/CefSharp

BSD授权

如果您不知道,Chrome会使用Webkit的一个分支,Safari也会使用它。 以下是几个同样重要的问题:

  • 用C#嵌入Webkit
  • 用C#嵌入Gecko(Firefox引擎)

Webkit的一个不是很好,因为其他答案说,一个版本不再工作(谷歌代码之一)和单声道是实验性的。 如果有人做了一个体面的.NET包装的努力,但它不是任何人似乎想要做的事情 – 这是令人惊讶的,因为它现在已经支持HTML5和许多其他功能,IE浏览器(8 )引擎缺乏。

更新(2014年)

有一个新的双重许可项目,允许您将Chrome嵌入到名为Awesomium的.NET应用程序中。 它带有一个.NET API,但是需要一些黑客进行渲染(这些示例将浏览器窗口绘制到缓冲区,将缓冲区绘制为图像并刷新计时器)。

觉得这是“战地风云3”中的Origin使用的浏览器。

更新(2016)

现在有一个DotesBrowser , Awesomium的商业替代品。 它基于铬。

我已经测试了C#Web浏览器组件的替代品几天了,这里是我的列表:

1.使用较新的IE版本8,9:

网页浏览器组件是IE7而不是IE8? 如何改变这个?

优点:

  • 运行它并不需要太多的工作
  • 如果IE9支持一些HTML5 / CSS3,则IE10支持

缺点:

  • 目标机器必须安装有目标IE版本,IE10仍然在Win7上预览

这不需要太多的工作,你可以得到一些HTML5和CSS3支持,虽然IE9缺乏一些最好的CSS3和HTML5功能。 但我相信你可以让IE10以同样的方式运行。 问题是目标系统将不得不安装IE10,并且由于在Windows 7上仍然处于预览状态,所以我建议不要这样做。

2. OpenWebKitSharp

OpenWebKitSharp是基于WebKit.NET 0.5项目的webkit引擎的.net包装器。 WebKit是Chrome / Safari使用的布局引擎

优点:

  • 积极开发
  • HTML5 / CSS3支持

缺点:

  • 许多功能没有实现
  • 不支持x64(应用程序必须为x86构建)

OpenWebKit是相当不错的,虽然许多功能还没有实现,我经历了很少的问题,使用它的视觉工作室在这里抛出空对象引用,然后在设计模式,有一些JS问题。 每个使用它的人都会马上注意到js alert什么都不做。 像mouseup,mousedown等事件不起作用,JS拖放是越野车等等..

我也有安装它的一些困难,因为它需要安装特定版本的VC可再发行,所以在例外之后,我查看事件日志,找到VC的版本,并安装它。

3. GeckoFX

优点:

  • 适用于单声道
  • 积极开发
  • HTML5 / CSS3支持

缺点:

  • D</s>o̶e̶s̶n̶'̶t̶̶s̶u̶p̶p̶o̶r̶t̶̶̶̶6̶4̶̶̶̶̶̶</s></s>̶̶̶̶̶̶</s></s></s></s>̶̶̶</s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s>

GeckoFX是一个跨平台的Webrowser控件,用于嵌入到WinForms应用程序中。 这可以在Windows上使用.NET,在Linux上使用mono。 Gecko是Firefox使用的一个布局引擎。

我遇到了一些GeckoFX没有被积极开发的信息,这当然是Firefox的一两个版本,但是这是正常的,我对这个活动和控件本身印象深刻。 它做我需要的一切,但我需要一些时间让它运行,这是一个小教程让它运行:

  1. 下载GeckoFx-Windows-16.0-0.2 ,在这里你可以检查是否有更新的GeckoFX
  2. 添加两个下载的DLL的引用
  3. 由于GeckoFX是包装,你需要XulRunner,去版本列表看看你需要哪一个
  4. 现在我们知道我们需要哪个版本的XulRunner,我们进入Mozilla XulRunner发行版 ,进入版本文件夹 – > runtimes – > xulrunner-(your_version).en-US.win32.zip,在我们的例子中是xulrunner-16.0.en- US.win32.zip
  5. 解压缩所有文件并将所有文件复制到bin \ Debug(或者如果您的项目设置为释放,则释放)
  6. 去你的窗体的视觉工作室设计师,进入工具箱,右键单击里面 – >选择项目 – >浏览 – >查找下载的GeckoFX winforms dll文件 – >确定
  7. 现在你应该有新的控制GeckoWebBrowser

如果你真的必须使用Chrome浏览器,看看这个名为Awesomium的产品,它是免费的非商业项目,但许可证是几千美元的商业。

您可以使用注册表来设置浏览器控件的IE版本。 转到:HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION,并添加“yourApplicationName.exe”的值为browser_emulation若要查看browser_emulation的值,请参阅链接: http : //msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation

看看Mono.WebBrowser控件 – 它将Gecko(如Firefox所使用的)或WebKit(Safari所使用的)嵌入WinForms(不使用ActiveX)。

我知道这不是一个“替代”的WebBrowser控件,但是当我显示一个使用BootStrap 3+进行布局的页面时,我遇到了一些可怕的渲染问题,然后我发现了一个建议我使用以下内容的文章。 显然它是特定于IE浏览器,并告诉它使用客户端机器上发现的最新变化(所以它不会使用IE7,因为我相信是默认)

所以只要把:

 <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> 

在文档头部的某个地方。

如果当然这不是你的文档,那么这显然不会帮助(虽然我个人认为这是一个安全漏洞,如果你正在阅读的网页不是由你自己通过网页浏览器控制创建 – 为什么不只是使用网页浏览器!)

祝你好运。

我有同样的问题,WebBrowser使用旧版本的IE浏览器,一些谷歌搜索我碰到以下代码,使更改到注册表,使WebBrowser使用最新的IE版本可能:

  public enum BrowserEmulationVersion { Default = 0, Version7 = 7000, Version8 = 8000, Version8Standards = 8888, Version9 = 9000, Version9Standards = 9999, Version10 = 10000, Version10Standards = 10001, Version11 = 11000, Version11Edge = 11001 } public static class WBEmulator { private const string InternetExplorerRootKey = @"Software\Microsoft\Internet Explorer"; public static int GetInternetExplorerMajorVersion() { int result; result = 0; try { RegistryKey key; key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey); if (key != null) { object value; value = key.GetValue("svcVersion", null) ?? key.GetValue("Version", null); if (value != null) { string version; int separator; version = value.ToString(); separator = version.IndexOf('.'); if (separator != -1) { int.TryParse(version.Substring(0, separator), out result); } } } } catch (SecurityException) { // The user does not have the permissions required to read from the registry key. } catch (UnauthorizedAccessException) { // The user does not have the necessary registry rights. } return result; } private const string BrowserEmulationKey = InternetExplorerRootKey + @"\Main\FeatureControl\FEATURE_BROWSER_EMULATION"; public static BrowserEmulationVersion GetBrowserEmulationVersion() { BrowserEmulationVersion result; result = BrowserEmulationVersion.Default; try { RegistryKey key; key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); if (key != null) { string programName; object value; programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]); value = key.GetValue(programName, null); if (value != null) { result = (BrowserEmulationVersion)Convert.ToInt32(value); } } } catch (SecurityException) { // The user does not have the permissions required to read from the registry key. } catch (UnauthorizedAccessException) { // The user does not have the necessary registry rights. } return result; } public static bool SetBrowserEmulationVersion(BrowserEmulationVersion browserEmulationVersion) { bool result; result = false; try { RegistryKey key; key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); if (key != null) { string programName; programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]); if (browserEmulationVersion != BrowserEmulationVersion.Default) { // if it's a valid value, update or create the value key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord); } else { // otherwise, remove the existing value key.DeleteValue(programName, false); } result = true; } } catch (SecurityException) { // The user does not have the permissions required to read from the registry key. } catch (UnauthorizedAccessException) { // The user does not have the necessary registry rights. } return result; } public static bool SetBrowserEmulationVersion() { int ieVersion; BrowserEmulationVersion emulationCode; ieVersion = GetInternetExplorerMajorVersion(); if (ieVersion >= 11) { emulationCode = BrowserEmulationVersion.Version11; } else { switch (ieVersion) { case 10: emulationCode = BrowserEmulationVersion.Version10; break; case 9: emulationCode = BrowserEmulationVersion.Version9; break; case 8: emulationCode = BrowserEmulationVersion.Version8; break; default: emulationCode = BrowserEmulationVersion.Version7; break; } } return SetBrowserEmulationVersion(emulationCode); } public static bool IsBrowserEmulationSet() { return GetBrowserEmulationVersion() != BrowserEmulationVersion.Default; } } 

您只需要创建一个类并将其放入该代码中,然后在程序启动时运行以下代码:

  if (!WBEmulator.IsBrowserEmulationSet()) { WBEmulator.SetBrowserEmulationVersion(); } 

看看DotNetBrowser库。 它提供了基于Chromium的WPF和WinForms浏览器控件,这些控件很容易嵌入到.NET应用程序中。 它支持所有的现代Web标准,包括HTML5,CSS3和JavaScript。 呈现的页面在Google Chrome浏览器中看起来完全一样。

该库继承了Chromium的多进程架构 – 每个网页都在一个单独的Chromium进程中呈现,即使在插件崩溃或网页出现任何其他意外错误之后,该应用程序仍将继续工作。

以下是DotNetBrowser提供的其他一些有用的功能:可以监听加载事件,处理网络活动,配置代理,模拟用户操作,使用cookie,访问和修改DOM,监听DOM事件,从.NET调用JavaScript。反之亦然,在网页上使用网络摄像头和麦克风,建立基于WebRTC的通信, 等等 。

查看API参考了解更多详情。

下面的代码片段演示了如何创建一个BrowserView,将其嵌入到Form中,并加载一个URL:

 using System.Windows.Forms; using DotNetBrowser; using DotNetBrowser.WinForms; namespace WinForms.DotNetBrowser { public partial class Form1 : Form { public Form1() { InitializeComponent(); BrowserView browserView = new WinFormsBrowserView(); Controls.Add((Control) browserView); browserView.Browser.LoadURL("http://www.youtube.com"); } } } 

一旦你运行上面的例子,你会得到以下输出:

在这里输入图像描述

这个图书馆是商业的,但是它可以在开放源代码和学术项目中免费使用。 商业许可包括不同团队规模的支持包。 也可以购买图书馆的源代码。

除了自己的页面之外,组件还可以作为NuGet包和Visual Studio Marketplace中的VSIX包提供。

我尝试了一些Webkit变体,但是根据我的经验,没有什么比OpenWebkitSharp具有的进步更胜一筹 。 喜欢它喜欢它.. HTML5和CSS3的分数尽可能接近谷歌浏览器。 非常好的API和事件模型。 如果您发现“未实现”的API很可能是因为它们没有在Webkit中实现。 其他一切都很好。

OpenWebKitSharp是基于WebKit.NET 0.5项目的webkit引擎的.net包装器。 它为0.5版本增加了更多的功能,并提供比构建更多的方法。 OpenWebKitSharp支持开罗build(0.5)和webkit的夜间版本(默认情况下是Nightly)。 在版本1.5稳定和更多的夜间建设包括在建立后自动复制。 在之前的版本中,cairo构建会发生这种情况。 OpenWebKitSharp目前支持GTLite Navigator,一个快速,稳定和灵活的网络浏览器。

试试EO.WebBrowser 。 这是新的,基于最新版本的Chrome浏览器。 最好的部分是,它包装在一个单一的.NET DLL的一切,所以不仅易于使用和部署,而且相同的DLL支持32位和64位,因为它是一个.NET DLL。

我已经使用了GeckoFX,它为我提供了很好的服务。 它使用Firefox引擎。 我遇到过的唯一警告就是它在文档实际完全加载之前发出一次“DocumentLoaded”事件……我认为当HTML被加载时,它会弹出一个,然后另一个图像和东西被加载。 我已经通过简单地忽略第一个来修复它,而且迄今为止它一直非常精美。

你可以在这里找到它: https : //bitbucket.org/geckofx/

像大多数体面的图书馆一样,它是开源的。

MozNet是一个.NET控件,以前基于或多或少被遗弃的GeckoFX控件,但是正在全面开发中,并且具有比GeckoFX更能够动摇的功能。 您可以在Se7en Soft网站上找到它。

EO.BrowserControl快速简单。 它具有Chrome浏览器引擎,可以与任何版本的.NET一起使用

https://visualstudiogallery.msdn.microsoft.com/fcee0646-42e7-484f-b22e-f8b2ace55dd7

注意:这是一个商业许可的产品,我不是在考虑这一点。 在尝试了其他各种各样的东西之后,我最终选择了这个。

2016年更新:

还有3个我可以建议的选项:

1. BrowseEmAll.Cef

.Net组件,可用于将Chrome引擎集成到.Net应用程序中。 基于CefGlue,但更新到最新的Chrome版本有点快。 此外,还有一个商业支持选项,可能会派上用场。 当然,这个组件本身就是开源的

2. BrowseEmAll.Gecko

另一个可用于将Firefox引擎集成到.Net应用程序中的.Net组件。 这是基于Geckofx,但不同于当前版本的Geckofx,这将与Firefox的正常版本构建一起工作。 要使用Geckofx,您需要自己构建Firefox。 再次商业支持是可用的,但组件本身是完全开源的

3.浏览完整的核心API

需要.Net应用程序中的所有不同的浏览器? BrowseEllll Core API可以将Chrome,Firefox,Webkit和Internet Explorer集成到您的应用程序中。 尽管如此,但这是一个商业产品

(充分披露:我为这家公司工作,所以我把一切所说的一切)

如果您正在寻找一个好的基于IE的控制 – 请查看: http : //code.google.com/p/csexwb2/

我用它在生产产品。 这是相当不错的,有很好的演示,虽然现在不像以前那样维护。

Geckofx和Webkit.net起初都很有前途,但是它们并没有分别跟上Firefox和Chrome,IE浏览器的改进,Web浏览器的控制也是如此,尽管IE7的默认行为类似于IE7,有,但可以通过进入注册表,并将其更改为允许HTML5的IE9来解决。

看看GeckoFX控件。

我已经尝试过所有的浏览器。 不幸的是,在所有情况下,唯一真正为我工作的是EO.Browser。 我希望我可以选择一个免费的解决方案,但我最终与EO.Browser。 这是相当昂贵,但保持良好。

2016年更新:

对我来说,IE的唯一可靠,维护的浏览器是EO.WebBrowser。 我花了几天,一周的时间尝试其他人。 他们都有一些问题在某个时候阻止了我的表演。