¿Reemplazar el control .NET WebBrowser con un mejor navegador, como Chrome?

¿Hay alguna manera relativamente fácil de insertar un navegador moderno en una aplicación .NET?

Por lo que yo entiendo, el control WebBrowser es un contenedor para IE , que no sería un problema, excepto que parece una versión muy antigua de IE , con todo lo que implica en términos de errores de CSS, seguridad potencial riesgos (si el motor de renderizado no fue parchado, ¿realmente puedo esperar que se solucionen los miles de millones de problemas de desbordamiento del búfer?) y otros problemas.

Estoy usando Visual Studio C # (edición express, ¿hace alguna diferencia aquí?)

Me gustaría integrar un buen navegador web en mis aplicaciones. En algunos casos, solo lo utilizo para manejar el proceso de registro del usuario, la interfaz con algunas de las funciones de mi sitio web y otras cosas de ese orden, pero tengo otra aplicación en mente que requerirá un mayor control … err.

Necesito:

  • Un navegador que puede integrarse dentro de una ventana de mi aplicación (no una ventana separada)
  • Un buen soporte para CSS, js y otras tecnologías web, a la par de cualquier navegador moderno
  • Funciones básicas del navegador como “navegar”, “volver”, “volver a cargar” …
  • Acceso liberal al código de página y salida.

Estaba pensando en Chrome, ya que viene bajo la licencia BSD, pero estaría igual de feliz con una versión reciente de IE.

En la medida de lo posible, me gustaría mantener las cosas simples. Lo mejor sería si se pudiera parchar el control WebBrowser existente, que ya cubre aproximadamente el 70% de lo que necesito, pero no creo que eso sea posible.

Encontré un control ActiveX para Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm ) pero parece que es una versión anterior, por lo que no es necesariamente una mejora.

Estoy abierto a sugerencias

Checkout CefSharp .Net bindings, un proyecto que comencé hace un tiempo que afortunadamente fue recogido por la comunidad y se convirtió en algo maravilloso.

El proyecto engloba el Chromium Embedded Framework y se ha utilizado en varios proyectos importantes, incluido el cliente Windows de Rdio, Facebook Messenger para Windows y Github para Windows.

Cuenta con controles de navegador para WPF y Winforms y tiene toneladas de características y puntos de extensión. Al estar basado en Chromium, también es increíblemente rápido.

Cógelo de NuGet: Install-Package CefSharp.Wpf o Install-Package CefSharp.WinForms

Vea ejemplos y dé su opinión / comentarios / solicitudes de extracción: https://github.com/cefsharp/CefSharp

Licencia BSD

Chrome utiliza (un tenedor de) Webkit si no lo sabía, que también es utilizado por Safari. Aquí hay algunas preguntas que son de la misma veta:

  • Incrustar Webkit con C #
  • Incrustar Gecko (motor de Firefox) con C #

El webkit one no es tan bueno como dice la otra respuesta, una versión ya no funciona (el código de google uno) y el mono es experimental. Sería bueno si alguien hiciera el esfuerzo de crear un contenedor de .NET decente, pero no es algo que alguien parezca querer hacer, lo que es sorprendente dado que ahora tiene soporte para HTML5 y muchas otras funciones que el IE (8 ) motor no tiene.

Actualización (2014)

Hay un nuevo proyecto de doble licencia que le permite incrustar Chrome en sus aplicaciones .NET llamadas Awesomium . Viene con una API .NET pero requiere bastantes ataques para renderizar (los ejemplos dibujan la ventana del navegador en un buffer, pintan el buffer como una imagen y refrescan en un temporizador).

Creo que este es el navegador utilizado por Origin en Battlefield 3.

Actualización (2016)

Ahora hay DotnetBrowser , una alternativa comercial a Awesomium. Está basado en Chromium.

He estado probando alternativas al componente del navegador web C # durante algunos días y aquí está mi lista:

1. Uso de versiones de IE más recientes 8,9:

El componente del navegador web es IE7, no IE8? ¿Cómo cambiar esto?

Pros:

  • No se requiere mucho trabajo para hacerlo funcionar
  • Algunos HTML5 / CSS3 admiten IE9, completo si es IE10

Contras:

  • La máquina de destino debe tener instalada la versión de IE de destino, IE10 todavía está en la vista previa en Win7

Esto no requiere mucho trabajo y puede obtener compatibilidad con HTML5 y CSS3 aunque IE9 carece de algunas de las mejores características de CSS3 y HTML5. Pero estoy seguro de que podrías obtener IE10 funcionando de la misma manera. El problema sería que el sistema de destino debería tener IE10 instalado, y dado que todavía está en la vista previa de Windows 7, sugeriría que no lo haga.

2. OpenWebKitSharp

OpenWebKitSharp es un contenedor .net para el motor de webkit basado en el proyecto WebKit.NET 0.5. WebKit es un motor de diseño utilizado por Chrome / Safari

Pros:

  • Desarrollado activamente
  • Soporte HTML5 / CSS3

Contras:

  • Muchas características no implementadas
  • No es compatible con x64 (la aplicación debe estar diseñada para x86)

OpenWebKit es bastante bueno, aunque muchas características aún no se han implementado, tuve algunos problemas al usarlo con Visual Studio que arroja una referencia de objeto nulo aquí y luego en el modo de diseño, hay algunos problemas de js. Todos los que lo usan notarán inmediatamente que la alerta js no hace nada. Eventos como mouseup, mousedown … etc. no funcionan, js drag and drop tiene errores, etc.

También tuve algunas dificultades para instalarlo, ya que requiere una versión específica de VC redistributable instalada, por lo que después de la excepción, miré el registro de eventos, encontré la versión de VC y lo instalé.

3. GeckoFX

Pros:

  • Funciona en mono
  • Desarrollado activamente
  • Soporte HTML5 / CSS3

Contras:

  • D̶o̶e̶s̶n̶’̶t̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶x̶6̶4̶ ̶ (̶A̶p̶p̶ ̶x̶6̶4̶ ̶b̶e̶ ̶b̶e̶ ̶b̶e̶ ̶b̶u̶i̶l̶t̶ ̶f̶o̶r̶t̶ ̶x̶8̶6̶) ̶ – ver comentarios a continuación

GeckoFX es un control Webrowser de plataforma cruzada para incrustar en aplicaciones WinForms. Esto se puede usar con .NET en Windows y con mono en Linux. Gecko es un motor de diseño utilizado por Firefox.

Me topé con poca información de que GeckoFX no se desarrolló activamente, lo cual no es cierto, por supuesto, siempre hay una o dos versiones detrás de Firefox, pero eso es normal, estaba realmente impresionado por la actividad y el control en sí. Hace todo lo que necesitaba, pero necesitaba algo de tiempo para hacerlo funcionar, aquí hay un pequeño tutorial para que funcione:

  1. Descargue GeckoFx-Windows-16.0-0.2 , aquí puede verificar si hay un GeckoFX más nuevo disponible
  2. Agregue referencias a dos dll descargados
  3. Como GeckoFX es contenedor, necesitas XulRunner, ve a la Lista de versiones para ver cuál necesitas
  4. Ahora que sabemos qué versión de XulRunner necesitamos, vamos a las versiones de Mozilla XulRunner , vamos a la carpeta de versiones -> runtimes -> xulrunner- (your_version) .en-US.win32.zip, en nuestro caso xulrunner-16.0.en- US.win32.zip
  5. Descomprime todo y copia todos los archivos en tu bin \ Debug (o suelta si tu proyecto está configurado para lanzar)
  6. Vaya al diseñador de estudio visual de su formulario, vaya a la caja de herramientas, haga clic con el botón derecho dentro -> Elegir elementos -> Buscar -> Buscar archivos GeckoFX winforms dll descargados -> Aceptar
  7. Ahora deberías tener un nuevo control GeckoWebBrowser

Si realmente debe usar Chrome, eche un vistazo a este producto llamado Awesomium , es gratis para proyectos no comerciales, pero la licencia es de unos pocos miles de dólares para fines comerciales.

Puede usar el registro para establecer la versión de IE para el control del navegador web. Vaya a: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION y agregue “yourApplicationName.exe” con el valor de browser_emulation. Para ver el valor de browser_emulation, consulte el enlace: http://msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation

Tuve el mismo problema, el WebBrowser estaba usando una versión anterior de IE, con algo de Google me encontré con el siguiente código que hace un cambio en el registro y hace que WebBrowser use la última versión de IE posible:

  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; } } 

Solo necesita crear una clase y poner este código en ella, luego ejecute el siguiente código cuando comience el progtwig:

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

Observe el control Mono.WebBrowser : incorpora Gecko (como lo usa Firefox) o WebKit (como lo usa Safari) en WinForms (sin usar ActiveX).

Sé que este no es un control WebBrowser “de reemplazo”, pero estaba teniendo algunos problemas de renderización terribles al mostrar una página que estaba usando BootStrap 3+ para el diseño, etc. y luego encontré una publicación que sugería que use lo siguiente. Aparentemente es específico de IE y le dice que use la última variación encontrada en la máquina cliente para renderizar (para que no use IE7 como creo que es el predeterminado)

Así que solo pon:

  

en algún lugar en la parte principal de su documento.

Si, por supuesto, no es su documento, esto obviamente no ayudará (aunque personalmente considero que es un problema de seguridad si está leyendo páginas que no creó usted mismo a través del control del navegador web, ¿por qué no usar simplemente un navegador web?)

Buena suerte.

Eche un vistazo a la biblioteca DotNetBrowser . Proporciona controles de navegador basados ​​en Chromium WPF y WinForms, que son bastante fáciles de incorporar a la aplicación .NET. Es compatible con todos los estándares web modernos, incluidos HTML5, CSS3 y JavaScript. La página renderizada se ve exactamente como en Google Chrome.

La biblioteca hereda la architecture multiprocesamiento de Chromium: cada página web se procesa en un proceso separado de Chromium y la aplicación continuará funcionando incluso después de que el plugin se cuelgue o se produzca cualquier otro error inesperado en la página web.

Aquí hay algunas otras características útiles, proporcionadas por DotNetBrowser: es posible escuchar cargar eventos, manejar la actividad de red, configurar el proxy, simular acciones de usuario, trabajar con cookies, acceder y modificar DOM, escuchar eventos DOM, invocar JavaScript desde .NET y viceversa, use la cámara web y el micrófono en la página web, configure la comunicación basada en WebRTC, y más .

Consulte la Referencia de API para más detalles.

El siguiente fragmento de código muestra cómo crear un BrowserView, incrustarlo en un Formulario y cargar una 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"); } } } 

Una vez que ejecutas el ejemplo anterior obtendrás el siguiente resultado:

enter image description here

La biblioteca es comercial, sin embargo, es gratuita para uso en proyectos académicos y de código abierto. Las licencias comerciales incluyen paquetes de soporte para diferentes tamaños de equipo. También es posible comprar el código fuente de la biblioteca.

Además de su propia página, el componente está disponible como paquete NuGet y como paquete VSIX en Visual Studio Marketplace.

He intentado algunas variantes de Webkit, pero en mi experiencia nada supera los avances que tiene OpenWebkitSharp . Me encanta, me encanta. Los puntajes de HTML5 y CSS3 son lo más cercanos que pueden llegar a Google Chrome. Muy buen API y modelo de eventos. Si encuentra API “no implementadas” probablemente porque no están implementadas en Webkit. Todo lo demás funciona genial.

OpenWebKitSharp es un contenedor .net para el motor de webkit basado en el proyecto WebKit.NET 0.5. Agrega más funcionalidad a la versión 0.5 y proporciona más métodos que esa comstackción. OpenWebKitSharp es compatible tanto con la comstackción Cairo (0.5) como con las comstackciones nocturnas de webkit (Nightly de forma predeterminada). En la versión 1.5 estable y más, se incluye la construcción nocturna y se copia automáticamente después de la construcción. En versiones anteriores, esto sucede con la comstackción de El Cairo. OpenWebKitSharp actualmente impulsa GTLite Navigator, un navegador web rápido, estable y flexible.

Pruebe EO.WebBrowser . Es nuevo y está basado en la última versión del navegador Chrome. La mejor parte de esto es que empaqueta todo dentro de un .llll .NET por lo que no solo es muy fácil de usar e implementar, sino que también el mismo DLL admite tanto 32 bit como 64 bit porque es un dll de .NET.

He usado GeckoFX y me sirve muy bien. Utiliza el motor de Firefox. La única advertencia con la que me he topado, es que emite el evento “DocumentLoaded” una vez antes de que el documento esté realmente cargado … Creo que dispara uno cuando se carga el HTML, y luego otro cuando todo el las imágenes y cosas están cargadas. Lo arreglé simplemente ignorando el primero, y hasta ahora ha funcionado maravillosamente sin fallas.

Puede encontrarlo aquí: https://bitbucket.org/geckofx/

Como la mayoría de las bibliotecas decentes, es de código abierto.

MozNet es un control .NET, anteriormente basado en el control GeckoFX más o menos abandonado, pero está en pleno desarrollo y tiene muchas más funciones de las que GeckoFX puede agotar. Puede encontrarlo en el sitio web de Se7en Soft .

EO.BrowserControl es rápido y fácil. Tiene un motor de navegador Chrome y funciona con cualquier versión de .NET

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

Nota: Este es un producto con licencia comercial y no lo estoy promoviendo con eso en mente. Después de probar varias otras cosas, terminé eligiendo esto.

Actualización 2016:

Hay 3 opciones adicionales que puedo sugerir:

1. BrowseEmAll.Cef

Un componente .Net que se puede usar para integrar el motor Chrome en su aplicación .Net. Basado en CefGlue pero un poco más rápido en las actualizaciones de la última versión de Chrome. También hay una opción de soporte comercial disponible que puede ser útil para algunos. Por supuesto, el componente en sí es de código abierto .

2. BrowseEmAll.Gecko

Otro componente .Net que se puede usar para integrar el motor Firefox en su aplicación .Net. Esto está basado en Geckofx, pero a diferencia de la versión actual de Geckofx, funcionará con una versión de lanzamiento normal de Firefox. Para usar Geckofx necesitarás construir Firefox tú mismo. De nuevo, el soporte comercial está disponible, pero el componente en sí es completamente de código abierto .

3. BrowseEmAll Core API

¿Necesita todos los navegadores diferentes en su aplicación .Net? Que BrowseEm All API API puede integrar Chrome, Firefox, Webkit e Internet Explorer en su aplicación. Este es un producto comercial, así que ten cuidado.

(Divulgación completa: yo trabajo para esta empresa, así que toma todo lo que digo con un grano de sal)

ACTUALIZACIÓN 2018 MAYO

Si su objective es que la aplicación se ejecute en Windows 10, entonces ahora puede insertar el navegador Edge en su aplicación .NET utilizando Windows Community Toolkit .

Ejemplo de WPF:

1) Instalar Windows Community Toolkit Nuget Package

 Install-Package Microsoft.Toolkit.Win32.UI.Controls -Version 3.0.0-preview 

2) Código XAML

      

3) Código CS:

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // You can also use the Source property here or in the WPF designer wvc.Navigate(new Uri("https://www.microsoft.com")); } } 

Ejemplo de WinForms:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); // You can also use the Source property here or in the designer webView1.Navigate(new Uri("https://www.microsoft.com")); } } 

Por favor, consulte este enlace para más información.

Nota: esta biblioteca se encuentra en su etapa de vista previa.

Si está buscando un buen control basado en IE, consulte: http://code.google.com/p/csexwb2/

Lo he usado en productos de producción. Es bastante bueno y tiene buenas demostraciones, aunque parece que no se mantiene tan bien como antes.

Geckofx y Webkit.net fueron prometedores al principio, pero no se mantuvieron actualizados con Firefox y Chrome respectivamente, mientras que Internet Explorer mejoró, también lo hizo el control Webbrowser, aunque se comporta como IE7 de forma predeterminada independientemente de la versión de IE que pero eso se puede arreglar yendo al registro y cambiándolo a IE9 permitiendo HTML5.

Mira el control GeckoFX .

He probado todos los navegadores que están disponibles. Desafortunadamente, el único que realmente funcionó para mí en todas las circunstancias fue EO.Browser. Ojalá pudiera haber elegido una solución gratuita, pero terminé con EO.Browser. Es bastante caro, pero está bien mantenido.

Actualización 2016:

Para mí, la única alternativa de navegador confiable y mantenida para IE es EO.WebBrowser. Pasé días y semanas probando a los demás. Todos ellos tuvieron algunos problemas que detuvieron el progtwig en algún momento.