Opciones para incrustar Chromium en lugar del control IE WebBrowser con WPF / C #

158

El control WPF WebBrowser basado en Internet Explorer sufre algunos problemas de teclado y enfoque y problemas de pérdida de memoria . Como solución alternativa a estos problemas, estamos considerando opciones disponibles para alojar Chromium en lugar del control WebBrowser en nuestro proyecto WPF / C # basado en la edición de HTML. Preguntas similares se han hecho aquí anteriormente. Leí las respuestas e hice mi propia investigación, pero espero obtener más comentarios de personas que realmente han utilizado cualquiera de las siguientes opciones en proyectos de calidad de producción :

Awesomium y Awesomium.NET

Parece muy apropiado, pero no me gusta el hecho de que el proyecto no sea de código abierto y que el código fuente completo no esté fácilmente disponible. Además, podría ser una exageración para nuestro proyecto, ya que el renderizado fuera de pantalla no es algo de lo que realmente dependamos.

Chromium Embedded Framework (CEF) y enlaces .NET para CEF

Esta es probablemente la mejor opción disponible actualmente. El proyecto parece estar vivo y activo, estando actualmente sincronizado con Chrome v27. CEF3 utiliza la arquitectura multiproceso de Chrome. También parece que Adobe le está dando algún respaldo .

Marco de Chrome de Google

Si bien el propósito original era ser un complemento HTML5 para IE y Firefox, en realidad también funciona como control ActiveX independiente, por lo que podría envolverlo para usarlo con WPF. Expone una API suficiente para la interacción con la página web interna ( onmessage, addEventListener/removeEventListener, postMessage). Soy consciente de que Google debe descontinuar Chrome Frame, pero supongo que las fuentes permanecerán en el repositorio de Chromium. No debería ser difícil actualizarlo con el último código de Chromium a medida que avanzamos, y tendríamos un control total sobre esto.

WebKit .NET wrapper

No es exactamente basado en cromo y no utiliza el motor V8, por lo que no es realmente una opción.

¿Hay alguna otra opción que haya pasado por alto?

Le agradecería mucho que alguien compartiera su experiencia con cualquiera de las opciones anteriores para un proyecto WPF de calidad de producción en la vida real. ¿Tuvo alguna implicación de integración, licencia o implementación? Gracias.

[EDITADO] También me gustaría agradecer a artlung por dar un impulso a esta pregunta al proporcionar una generosa oferta de recompensa.

noseratio
fuente

Respuestas:

124

Ya ha enumerado las soluciones más notables para incrustar cromo (CEF, Chrome Frame, Awesomium). No hay más proyectos que importen.

Todavía existe el proyecto Berkelium (ver Berkelium Sharp y Berkelium Managed ), pero tiene una versión antigua de Chromium.

CEF es su mejor apuesta: es de código abierto y se actualiza con frecuencia. Es la única opción que le permite incorporar la última versión de Chromium. Ahora que Per Lundberg está trabajando activamente en la transferencia de CEF 3 a CefSharp , esta es la mejor opción para el futuro. También hay Xilium.CefGlue , pero este proporciona una API de bajo nivel para CEF, se une a la API C de CEF. CefSharp, por otro lado, se une a la API C ++ de CEF.

Adobe no es el único jugador importante que usa CEF, vea otras aplicaciones notables que usan CEF en la página de Wikipedia de CEF .

Actualizar Chrome Frame no tiene sentido ya que el proyecto ha sido retirado .

Czarek Tomczak
fuente
También se olvidó de decir que la mitad de las cosas no funcionarán ... como borrar cookies, caché ... configurar proxies, etc. Simplemente use Awesomium y ahorre el problema.
44
Jeje, buena respuesta Czarek, gracias por el crédito. :) (no había visto esto hasta ahora)
Per Lundberg
44
Por supuesto, vale la pena señalar: claramente puede haber cosas "faltantes" en cualquier proyecto de código abierto. Ni Xilium.CefGlue ni CefSharp son excepciones a esa regla. Lo bueno de las cosas de código abierto es que en realidad puede pasar una cantidad de tiempo (razonablemente baja) en la búsqueda de un problema menor y obtener su solución incluida. Vemos eso de vez en cuando con CefSharp y es bastante bueno.
Por Lundberg
1
¿Corregirme si estoy equivocado pero CefSharp no requiere DLL de más de 50 MB? Eso da como resultado una configuración de instalación gigante. Libcef.dll aparece como una dependencia principal y tiene 38 MB
Krafty
2
Las configuraciones de instalación de @Krafty permiten empaquetarlo utilizando algoritmos como 7z y esto da como resultado un tamaño reducido de 55 MB -> a 17 MB. El tamaño de CefSharp no es mucho en comparación con Google Chrome, que tiene 152 MB sin empaquetar y 40 MB con la configuración empaquetada.
Czarek Tomczak
11

Tuvimos exactamente el mismo desafío hace algún tiempo. Queríamos usar la biblioteca de código abierto CEF3 que está basada en WPF y es compatible con .NET 3.5.

En primer lugar, el autor de CEF a sí mismo en la lista de unión para diferentes idiomas aquí .

En segundo lugar, seguimos adelante con el enlace de código abierto .NET CEF3 que se llama Xilium.CefGlue y tuvimos un buen éxito con él. En los casos en que algo no funciona como cabría esperar, el autor suele responder muy bien a los problemas abiertos en el rastreador de bitbucket incorporado

Hasta ahora nos ha servido bien. El autor actualiza su biblioteca para admitir las últimas versiones de CEF3 y correcciones de errores en bases regulares.

Artem
fuente
2
Esto es realmente un punto (viniendo del "otro lado", siendo CefSharp en esto): CefSharp es 4.0 solo desde hace unos meses, debido a problemas que admiten 3.5 con conjuntos de herramientas VS más nuevos. (VS2010 + no puede admitir marcos anteriores con C ++ / CLI, lo cual es un poco triste porque nos obliga a usar .NET 4 o una versión de Visual Studio realmente antigua ...)
Según Lundberg el
8

Aquí hay otro:

http://www.essentialobjects.com/Products/WebBrowser/Default.aspx

Este también se basa en el último motor de Chrome, pero es mucho más fácil de usar que el CEF. Es un único .NET dll al que simplemente puede hacer referencia y usar.

Jason
fuente
El soporte también es fantástico.
huseyint
3
Parece que falta información básica en ese sitio web: ¿qué versión de Chrome incluye?
Czarek Tomczak
2
Uh-oh, no es gratis. NO GRATUITO. ¿Qué estaban pensando estos tipos? :)
dkellner
Debería afirmarse por adelantado que, si bien hay una versión de prueba, no es gratuita.
Ewilan
8

Eche un vistazo a la biblioteca DotNetBrowser desarrollada por el equipo al que pertenezco. Proporciona controles de navegador WPF y WinForms basados ​​en Chromium, que son bastante fáciles de integrar en 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 arquitectura multiproceso de Chromium: cada página web se procesa en un proceso de Chromium separado y la aplicación continuará funcionando incluso después de que el complemento se bloquee o se produzca cualquier otro error inesperado en la página web.

Estas son algunas otras características útiles, proporcionadas por DotNetBrowser: es posible escuchar eventos de carga, manejar la actividad de la red, configurar proxy, simular acciones del usuario, trabajar con cookies, acceder y modificar DOM, escuchar eventos DOM, llamar a 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 fragmento de código siguiente 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 ejecute el ejemplo anterior, obtendrá el siguiente resultado:

ingrese la descripción de la imagen aquí

La biblioteca es comercial. 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.

Vladimir
fuente
1
parece válido y he incorporado la versión de prueba en mi aplicación. El único problema es que es un producto comercial y la licencia no es muy barata. De lo contrario, me parece sólido.
DoronG
Lamentablemente, DotNetBrowser NO es gratis. : /
Deniz
4

He usado Awesomium.NET. Aunque no me gusta el hecho de que no es de código abierto, y también el hecho de que utiliza un motor de renderizado Webkit bastante antiguo, es realmente fácil de usar. Ese es el único respaldo que puedo darle.

Lema Ming
fuente
1
¿Podría compartir qué tan grande era su base de usuarios para ese proyecto, más o menos?
noseratio
En realidad, nunca implementé el proyecto, por lo que la base de usuarios era cero. Solo estaba experimentando con opciones yo mismo.
Ming Slogar
2
Sufrí durante meses apoyando una aplicación C # basada en Awesomium; puede ser genial para los juegos de C ++, pero en C # el control de su navegador es completamente defectuoso. La implementación complicada (necesita su instalador extraño para agregar cosas al GAC), el comportamiento defectuoso (a veces se inicia con una pantalla en negro, el usuario debe reiniciar la aplicación manualmente) y su baja velocidad (las páginas web NO se muestran cuando se cargan , se cuelga un poco hasta que la página se carga por completo / a la mitad, y tarda entre 5 y 10 segundos en inicializarse en una máquina
lenta
55
Finalmente fui con CefSharp y los resultados fueron sorprendentes. <100 ms de inicialización (es decir, inicio instantáneo) y sin "errores". Las cosas simplemente funcionan. Como debería. Además, CefSharp NO necesita agregarse al GAC, por lo que no se necesitan cambios en el instalador. Simplemente copie sus archivos y listo. ¿Mencioné que CEF / CefSharp es mejor que todas las bibliotecas de Mozilla / WebKit C # que probé? Ah, y por amor de Dios, no uses IE. Funciona. Sí, lo hace, pero carece por completo de características y funciona muy mal (velocidad).
TheFlash
1
@RobinRodricks Exactamente mi experiencia también. Casi dejé el enfoque, pero luego encontré a CefSharp :-) (¿Y a quién le importan un par de MB más, en estos días, cuando los controladores de impresora vienen en un DVD :-)?)
Xan-Kun Clark-Davis
2

Tuve el mismo problema con mi lector RSS WPF, originalmente fui con Awesomium (creo que la versión 1.6) Awesomium es genial. Obtiene mucho control para el almacenamiento en caché (imágenes y contenido HTML), ejecución de JavaScript, interceptar descargas, etc. También es súper rápido. El aislamiento del proceso significa que cuando el navegador falla, no bloquea la aplicación.

Pero también es pesado, incluso la versión de lanzamiento agrega aproximadamente 10-15 mb (no recuerdo el número exacto) y, por lo tanto, una leve penalización de inicio. Entonces me di cuenta, el único problema que tenía con el control del navegador IE era que arrojaría los errores de JavaScript de vez en cuando. Pero eso se solucionó con el siguiente fragmento.

Apenas utilicé mi aplicación en XP o Vista, pero en Win 7 y superiores nunca fallaba (al menos no porque usaba el control del navegador IE)

IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
    IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
    Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");

    webBrowser;
    sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
    if (webBrowser != null)
    {
        webBrowser.GetType().InvokeMember("Silent", 
                BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
    }
}
Sameer Vartak
fuente
Gracias por la respuesta. Entonces, ¿finalmente regresaste a IE desde Awesomium?
noseratio
Sí, lo hice. y he sido feliz Utilizo ClickOnce, por lo que el despliegue fue pequeño y no se bloqueó el inicio.
Sameer Vartak
Gracias, he votado tu respuesta. Por cierto, hay otra forma de obtener la IWebBrowser2interfaz interna .
noseratio
Frio. Cómo funcionan los controles Activex en WPF? Gracias por votar :-)
Sameer Vartak
Lo sentimos, no leí el enlace de referencia con cuidado. Sí, es una muestra de XAML y funciona. Gracias.
Sameer Vartak
1

Microsoft está lanzando el control WPF " Microsoft Edge WebView2 " que nos brindará una excelente opción gratuita para incorporar Chromium en Windows 10, Windows 8.1 o Windows 7. Está disponible a través de Nuget como paquete Microsoft.Web.WebView2.

scottheckel
fuente
Esta es una gran opción, aunque es 2020 y hoy estaría buscando una solución multiplataforma, por ejemplo, Chromely .
noseratio
1
Creo que depende si está buscando agregar un poco de material web a una aplicación de escritorio o una aplicación de escritorio construida como una aplicación web. Creo que solo usarías WebView2 solo si fuera un pequeño elemento web para una aplicación de escritorio.
scottheckel