Opzioni per incorporare Chromium invece del controllo IE WebBrowser con WPF / C #


158

Il controllo WPF WebBrowser basato su Internet Explorer soffre di alcuni problemi relativi alla tastiera, allo stato attivo e alla perdita di memoria . Come soluzione alternativa a questi problemi, stiamo prendendo in considerazione le opzioni disponibili per l'hosting di Chromium anziché il controllo WebBrowser nel nostro progetto WPF / C # basato sull'editing HTML. Domande simili sono state poste qui in precedenza. Ho letto le risposte e fatto le mie ricerche, ma spero di ottenere qualche feedback in più dalle persone che hanno effettivamente utilizzato una delle seguenti opzioni in progetti di qualità di produzione :

Awesomium e Awesomium.NET

Sembra molto appropriato, ma non mi piace il fatto che il progetto non sia open source e la fonte completa non sia facilmente disponibile. Inoltre, potrebbe essere eccessivo per il nostro progetto, poiché il rendering fuori schermo non è qualcosa da cui dipendiamo veramente.

Chromium Embedded Framework (CEF) e attacchi .NET per CEF

Questa è probabilmente l'opzione migliore attualmente disponibile. Il progetto sembra essere vivo e attivo, essendo attualmente sincronizzato con Chrome v27. CEF3 utilizza l'architettura multi-processo di Chrome. Sembra anche che Adobe stia dando un certo sostegno .

Chrome Frame di Google

Mentre lo scopo originale era di essere un plug-in HTML5 per IE e Firefox, in realtà funziona anche come controllo ActiveX autonomo, quindi potrei avvolgerlo per l'uso con WPF. Espone un'API sufficiente per l'interazione con la pagina Web interna ( onmessage, addEventListener/removeEventListener, postMessage). Sono consapevole che Google interromperà Chrome Frame, ma suppongo che le fonti rimarranno nel repository Chromium. Non dovrebbe essere difficile aggiornarlo con l'ultimo codice Chromium mentre procediamo e avremmo il pieno controllo su questo.

Wrapper WebKit .NET

Non esattamente basato su Chromium e non utilizza il motore V8, quindi non è davvero un'opzione.

C'è qualche altra opzione che avrei potuto trascurare?

Gradirei molto se qualcuno condividesse la sua esperienza con una qualsiasi delle opzioni di cui sopra per un progetto WPF nella vita reale e di qualità di produzione. Hai avuto implicazioni per l'integrazione, le licenze o la distribuzione? Grazie.

[EDITED] Vorrei anche ringraziare artlung per aver dato una spinta a questa domanda fornendo una generosa offerta di ricompensa.

Risposte:


124

Hai già elencato le soluzioni più importanti per incorporare Chromium (CEF, Chrome Frame, Awesomium). Non ci sono altri progetti che contano.

C'è ancora il progetto Berkelium (vedi Berkelium Sharp e Berkelium Managed ), ma emette una vecchia versione di Chromium.

CEF è la soluzione migliore: è completamente open source e viene aggiornato frequentemente. È l'unica opzione che ti consente di incorporare l'ultima versione di Chromium. Ora che Per Lundberg sta lavorando attivamente al porting di CEF 3 su CefSharp , questa è l'opzione migliore per il futuro. C'è anche Xilium.CefGlue , ma questo fornisce un'API di basso livello per CEF, che si lega all'API C di CEF. CefSharp invece si lega all'API C ++ di CEF.

Adobe non è l'unico giocatore principale che utilizza CEF, vedere altre applicazioni importanti che utilizzano CEF nella pagina di Wikipedia CEF .

L'aggiornamento di Chrome Frame non ha senso poiché il progetto è stato ritirato .


Hai dimenticato di dire anche che metà delle cose non funzionerà .. come cancellare i cookie, cache .. impostare i proxy ecc. Basta usare Awesomium e salvare il tuo salvataggio.

4
Hehe, bella risposta Czarek, grazie per il merito. :) (non l'avevo mai visto fino ad ora)
Per Lundberg il

4
Ovviamente, vale la pena sottolineare che in ogni progetto open source potrebbero esserci delle cose "mancanti". Né Xilium.CefGlue né CefSharp sono eccezioni a tale regola. La cosa bella delle cose open source è che puoi effettivamente spendere una quantità (ragionevolmente bassa) di tempo per esaminare un problema più piccolo e ottenere la tua correzione inclusa. Lo vediamo di tanto in tanto con CefSharp ed è abbastanza pulito.
Per Lundberg,

1
Correggimi se sbaglio, ma CefSharp non richiede DLL che superano i 50 MB? Ciò si traduce in un'impostazione di installazione gigante. Il libcef.dll è elencato come una delle principali dipendenze ed è 38 MB
Krafty

2
Le configurazioni di installazione di @Krafty consentono di comprimerlo utilizzando algoritmi come 7z e questo riduce le dimensioni da 55 MB -> a 17 MB. Le dimensioni di CefSharp non sono molto rispetto a Google Chrome, ovvero 152 MB decompressi e 40 MB di installazione imballati.
Czarek Tomczak,

11

Abbiamo avuto esattamente la stessa sfida qualche tempo fa. Volevamo andare con la libreria open source CEF3 che è basata su WPF e supporta .NET 3.5.

In primo luogo, l'autore di se stesso CEF elencato vincolante per le diverse lingue qui .

In secondo luogo, siamo andati avanti con l'associazione .NET CEF3 open source che si chiama Xilium.CefGlue e abbiamo avuto un buon successo con esso. Nei casi in cui qualcosa non funziona come ti aspetteresti, l'autore di solito è molto sensibile ai problemi aperti nel tracker bitbucket integrato

Finora ci ha servito bene. L'autore aggiorna la sua libreria per supportare le ultime versioni di CEF3 e le correzioni di bug su base regolare.


2
Questo è in realtà un punto (proveniente dall'altra parte, essendo CefSharp in questo) - CefSharp è 4.0 solo da pochi mesi, a causa di problemi con il supporto 3.5 con i set di strumenti VS più recenti. (VS2010 + non può supportare framework precedenti con C ++ / CLI, il che è un po 'triste perché ci costringe a usare .NET 4 o una versione davvero vecchia di Visual Studio ...)
Per Lundberg,

8

Eccone un altro:

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

Questo si basa anche sull'ultimo motore Chrome, ma è molto più facile da usare rispetto al CEF. È una singola dll .NET che puoi semplicemente fare riferimento e utilizzare.


Anche il supporto è fantastico.
huseyint,

3
Le informazioni di base sembrano mancare su quel sito Web: quale versione di Chrome include?
Czarek Tomczak,

2
Uh-oh, non libero. NON GRATIS. Cosa stavano pensando questi ragazzi? :)
dkellner

Qui dovrebbe essere dichiarato che, mentre esiste una versione di prova, non è gratuito.
Ewilan,

8

Dai un'occhiata alla libreria DotNetBrowser sviluppata dal team a cui appartengo. Fornisce i controlli del browser WPF e WinForms basati su Chromium, che sono abbastanza facili da integrare nell'applicazione .NET. Supporta tutti i moderni standard Web tra cui HTML5, CSS3 e JavaScript. La pagina di rendering appare esattamente come in Google Chrome.

La libreria eredita l'architettura multi-processo di Chromium: ogni pagina Web viene visualizzata in un processo Chromium separato e l'applicazione continuerà a funzionare anche dopo l'arresto anomalo del plug-in o qualsiasi altro errore imprevisto nella pagina Web.

Ecco alcune altre utili funzioni, fornite da DotNetBrowser: è possibile ascoltare il caricamento di eventi, gestire l'attività di rete, configurare il proxy, simulare azioni dell'utente, lavorare con i cookie, accedere e modificare DOM, ascoltare eventi DOM, chiamare JavaScript da .NET e viceversa, utilizzare la webcam e il microfono sulla pagina Web, impostare la comunicazione basata su WebRTC e altro ancora .

Controlla il riferimento API per maggiori dettagli.

Lo snippet di codice seguente mostra come creare un BrowserView, incorporarlo in un modulo e caricare un 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 volta eseguito l'esempio sopra, otterrai il seguente output:

inserisci qui la descrizione dell'immagine

La biblioteca è commerciale. Le licenze commerciali includono pacchetti di supporto per team di diverse dimensioni. È anche possibile acquistare il codice sorgente della biblioteca.

Oltre alla propria pagina, il componente è disponibile come pacchetto NuGet e come pacchetto VSIX nel Visual Studio Marketplace.


1
sembra valido e ho incorporato la versione di prova nella mia app. L'unico problema è che si tratta di un prodotto commerciale e la licenza non è molto economica. Altrimenti, mi sembra solido.
DoronG,

Purtroppo DotNetBrowser NON è gratuito! : /
Deniz

4

Ho usato Awesomium.NET. Anche se non mi piace il fatto che non sia open-source e anche il fatto che utilizzi un motore di rendering Webkit piuttosto vecchio, è davvero facile da usare. Questo è l'unico sostegno che posso dare.


1
Potresti condividere quanto era grande la tua base di utenti per quel progetto, più o meno?
noseratio,

In realtà non ho mai distribuito il progetto, quindi la base di utenti era zero. Stavo solo sperimentando le opzioni da solo.
Ming Slogar,

2
Ho sofferto per mesi supportando un'app C # basata su Awesomium; può oscillare per i giochi in C ++ ma in C # il loro controllo del browser è completamente errato. La distribuzione complicata (è necessario il loro strano programma di installazione per aggiungere elementi nel GAC), il comportamento errato (a volte si avvia con una schermata nera, l'utente deve riavviare l'app manualmente) e la sua bassa velocità (le pagine Web NON vengono visualizzate durante il caricamento , si blocca fino a quando la pagina non è completamente / caricata a metà e ci vogliono 5-10 secondi per inizializzare su una macchina slowish)
TheFlash

5
Alla fine sono andato con CefSharp e i risultati sono stati sorprendenti. Inizializzazione <100 ms (es. Instant init) e nessun "bug". Le cose funzionano e basta. Come dovrebbe. Inoltre, CefSharp NON deve essere aggiunto al GAC, quindi non sono necessarie modifiche al programma di installazione. Copia i tuoi file e vai. Ho già detto che CEF / CefSharp è migliore di ogni libreria C # di Mozilla / WebKit che ho testato? Oh, per l'amor del cielo non usare IE. Funziona. Sì, lo fa, ma è totalmente privo di funzionalità e funziona molto male (velocità).
TheFlash

1
@RobinRodricks Esattamente anche la mia esperienza. Ho quasi rinunciato all'approccio, ma poi ho trovato CefSharp :-) (E a ​​chi importa un altro paio di MB, in questi giorni, quando i driver della stampante arrivano su un DVD :-)?)
Xan-Kun Clark-Davis


2

Ho avuto lo stesso problema con il mio lettore RSS di WPF, inizialmente con Awesomium (penso la versione 1.6) Awesomium è fantastico. Hai un sacco di controllo per la memorizzazione nella cache (immagini e contenuti HTML), l'esecuzione di JavaScript, l'intercettazione dei download e così via. È anche super veloce. L'isolamento del processo indica che il browser si arresta in modo anomalo non blocca l'app.

Ma è anche pesante, anche la build di rilascio aggiunge circa 10-15mb (non ricordo il numero esatto) e quindi una leggera penalità all'avvio. Ho poi capito, l'unico problema che avevo con il controllo del browser IE era che avrebbe lanciato gli errori JavaScript ogni tanto. Ma questo è stato risolto con il seguente frammento.

Ho appena usato la mia app su XP o Vista ma su Win 7 e versioni successive non è mai andata in crash (almeno non perché ho usato il controllo browser 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 });
    }
}

Grazie per la risposta. Quindi alla fine sei tornato a IE da Awesomium?
noseratio,

Si l'ho fatto. e sono stato felice. Uso ClickOnce, quindi lo schieramento era minuscolo e nessun blocco all'avvio!
Sameer Vartak,

Grazie, ho votato a favore della tua risposta. A proposito, c'è un altro modo per ottenere l' IWebBrowser2interfaccia interna .
noseratio,

Freddo. i controlli Activex funzionano in WPF? Grazie per il voto
positivo

Siamo spiacenti, non ho letto attentamente il link di riferimento. Sì, è un esempio XAML e funziona. Grazie.
Sameer Vartak,

1

Microsoft sta rilasciando il controllo WPF " Microsoft Edge WebView2 " che ci offrirà un'ottima opzione gratuita per incorporare Chromium su Windows 10, Windows 8.1 o Windows 7. È disponibile tramite Nuget come pacchetto Microsoft.Web.WebView2.


Questa è un'ottima opzione, anche se è il 2020 e oggi sarei alla ricerca di una soluzione multipiattaforma, ad esempio Chromely .
noseratio,

1
Penso che dipenda se stai cercando di aggiungere un po 'di roba Web a un'app desktop o un'app desktop costruita come un'app Web. Penso che useresti WebView2 solo se fosse un po 'roba web per un'app desktop.
scottheckel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.