Options pour incorporer Chromium au lieu du contrôle IE WebBrowser avec WPF / C #

158

Le contrôle WPF WebBrowser basé sur Internet Explorer souffre de certains problèmes de clavier et de mise au point et de problèmes de fuite de mémoire . Comme solution alternative à ces problèmes, nous considérons les options disponibles pour l'hébergement de Chromium au lieu du contrôle WebBrowser dans notre projet WPF / C # basé sur l'édition HTML. Des questions similaires ont déjà été posées ici. J'ai lu les réponses et fait mes propres recherches, mais j'espère obtenir plus de commentaires de personnes qui ont effectivement utilisé l'une des options suivantes dans des projets de qualité de production :

Awesomium et Awesomium.NET

Cela semble très approprié, mais je n'aime pas le fait que le projet ne soit pas open-source et que la source complète ne soit pas facilement disponible. En outre, cela pourrait être excessif pour notre projet, car le rendu hors écran n'est pas quelque chose dont nous dépendons vraiment.

Chromium Embedded Framework (CEF) et liaisons .NET pour CEF

C'est probablement la meilleure option actuellement disponible. Le projet semble être vivant et actif, actuellement synchronisé avec Chrome v27. CEF3 utilise l'architecture multi-processus Chrome. Il semble également qu'Adobe lui donne une certaine approbation .

Chrome Frame de Google

Alors que le but initial était d'être un plugin HTML5 pour IE et Firefox, il fonctionne également en tant que contrôle ActiveX autonome, donc je pourrais l'envelopper pour une utilisation avec WPF. Il expose une API suffisante pour l'interaction avec la page Web interne ( onmessage, addEventListener/removeEventListener, postMessage). Je sais que Google doit interrompre Chrome Frame, mais je suppose que les sources resteront dans le référentiel Chromium. Il ne devrait pas être difficile de le mettre à jour avec le dernier code Chromium au fur et à mesure, et nous aurions un contrôle total sur cela.

Encapsuleur WebKit .NET

Pas exactement à base de chrome et n'utilise pas de moteur V8, ce n'est donc pas vraiment une option.

Y a-t-il une autre option que j'aurais pu négliger?

J'apprécierais beaucoup si quelqu'un partageait son expérience avec l'une des options ci-dessus pour un projet WPF de qualité de production réel. Avez-vous eu des implications d'intégration, de licence ou de déploiement? Je vous remercie.

[EDITED] Je voudrais également remercier artlung d' avoir donné un coup de pouce à cette question en proposant une généreuse offre de primes.

noseratio
la source

Réponses:

124

Vous avez déjà répertorié les solutions les plus notables pour intégrer Chromium (CEF, Chrome Frame, Awesomium). Il n'y a plus de projets qui comptent.

Il y a toujours le projet Berkelium (voir Berkelium Sharp et Berkelium Managed ), mais il émet une ancienne version de Chromium.

CEF est votre meilleur pari - il est entièrement open source et fréquemment mis à jour. C'est la seule option qui vous permet d'intégrer la dernière version de Chromium. Maintenant que Per Lundberg travaille activement sur le portage de CEF 3 vers CefSharp , c'est la meilleure option pour l'avenir. Il y a aussi Xilium.CefGlue , mais celui-ci fournit une API de bas niveau pour CEF, il se lie à l'API C de CEF. CefSharp d'autre part se lie à l'API C ++ de CEF.

Adobe n'est pas le seul acteur majeur à utiliser CEF, voir d'autres applications notables utilisant CEF sur la page wikipedia CEF .

La mise à jour de Chrome Frame est inutile puisque le projet a été retiré .

Czarek Tomczak
la source
Vous avez oublié de dire également que la moitié des choses ne fonctionnera pas ... comme la suppression des cookies, le cache ... la configuration des proxies, etc. Utilisez simplement Awesomium et enregistrez-vous.
4
Hehe, belle réponse Czarek, merci pour le crédit. :) (n'avait pas vu ça jusqu'à présent)
Per Lundberg
4
Bien sûr, il convient de le souligner: il peut clairement y avoir des choses "manquantes" dans tout projet open source. Ni Xilium.CefGlue ni CefSharp ne font exception à cette règle. La bonne chose à propos des produits open source est que vous pouvez en fait passer un temps (raisonnablement faible) à examiner un problème plus petit et à inclure votre correctif. On voit ça de temps en temps avec CefSharp et c'est plutôt chouette.
Per Lundberg
1
Corrigez-moi si je me trompe mais que CefSharp n'exige pas des DLL de plus de 50 Mo au total? Cela se traduit par une configuration d'installation géante. Le libcef.dll est répertorié comme une dépendance majeure et il est de 38 Mo
Krafty
2
Les configurations d'installation de @Krafty permettent de l'empaqueter en utilisant des algorithmes comme 7z et cela se traduit par une taille réduite de 55 Mo -> à 17 Mo. La taille de CefSharp n'est pas beaucoup par rapport à Google Chrome, qui est de 152 Mo décompressé et de 40 Mo de configuration emballée.
Czarek Tomczak
11

Nous avons eu exactement le même défi il y a quelque temps. Nous voulions aller avec la bibliothèque open source CEF3 qui est basée sur WPF et prend en charge .NET 3.5.

Tout d' abord, l'auteur du CEF lui - même la liste obligatoire pour les différentes langues ici .

Deuxièmement, nous sommes allés de l'avant avec la liaison open source .NET CEF3 qui s'appelle Xilium.CefGlue et avons eu un bon succès avec elle. Dans les cas où quelque chose ne fonctionne pas comme prévu, l'auteur est généralement très réactif aux problèmes ouverts dans le tracker bitbucket intégré

Jusqu'à présent, cela nous a bien servis. L'auteur met à jour sa bibliothèque pour prendre en charge les dernières versions du CEF3 et les corrections de bogues sur des bases régulières.

Artem
la source
2
C'est en fait un point (venant de «l'autre côté», étant CefSharp dans ce cas) - CefSharp n'est 4.0 que depuis quelques mois, à cause de problèmes de prise en charge de la version 3.5 avec les nouveaux jeux d'outils VS. (VS2010 + ne peut pas prendre en charge les anciens frameworks avec C ++ / CLI, ce qui est un peu triste car cela nous oblige à utiliser .NET 4 ou une très ancienne version de Visual Studio ...)
Per Lundberg
8

En voici un autre:

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

Celui-ci est également basé sur le dernier moteur Chrome mais il est beaucoup plus facile à utiliser que CEF. C'est une seule DLL .NET que vous pouvez simplement référencer et utiliser.

Jason
la source
Le support est également fantastique.
huseyint
3
Des informations de base semblent manquer sur ce site Web - quelle version de Chrome inclut-il?
Czarek Tomczak
2
Oh-oh, pas gratuit. PAS LIBRE. À quoi pensaient ces gars? :)
dkellner
Il convient de préciser ici que, bien qu'il existe une version d'essai, ce n'est pas gratuit.
ewilan
8

Jetez un œil à la bibliothèque DotNetBrowser développée par l'équipe à laquelle j'appartiens. Il fournit des contrôles de navigateur WPF et WinForms basés sur Chromium, qui sont assez faciles à intégrer dans l'application .NET. Il prend en charge toutes les normes Web modernes, notamment HTML5, CSS3 et JavaScript. La page rendue ressemble exactement à Google Chrome.

La bibliothèque hérite de l'architecture multi-processus de Chromium - chaque page Web est rendue dans un processus Chromium distinct, et l'application continuera de fonctionner même après le plantage du plugin ou toute autre erreur inattendue sur la page Web.

Voici quelques autres fonctionnalités utiles, fournies par DotNetBrowser: il est possible d'écouter les événements de chargement, de gérer l'activité du réseau, de configurer le proxy, de simuler les actions des utilisateurs, de travailler avec des cookies, d'accéder et de modifier le DOM, d'écouter les événements du DOM, d'appeler JavaScript depuis .NET et vice versa, utilisez la caméra Web et un microphone sur la page Web, mis en place une communication basée sur WebRTC, et plus .

Consultez la référence API pour plus de détails.

L'extrait de code ci-dessous montre comment créer un BrowserView, l'intégrer dans un formulaire et charger une 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");
        }
    }
}

Une fois que vous exécutez l'exemple ci-dessus, vous obtiendrez la sortie suivante:

entrez la description de l'image ici

La bibliothèque est commerciale. Les licences commerciales incluent des packages de support pour différentes tailles d'équipe. Il est également possible d'acheter le code source de la bibliothèque.

Outre sa propre page, le composant est disponible sous forme de package NuGet et de package VSIX dans Visual Studio Marketplace.

Vladimir
la source
1
semble valide et j'ai intégré la version d'essai dans mon application. Le seul problème est qu'il s'agit d'un produit commercial et que la licence n'est pas très bon marché. Sinon, ça me semble solide.
DoronG
Malheureusement, DotNetBrowser n'est PAS gratuit! : /
Deniz le
4

J'ai utilisé Awesomium.NET. Bien que je n'aime pas le fait qu'il ne soit pas open-source, et aussi le fait qu'il utilise un assez vieux moteur de rendu Webkit, il est vraiment facile à utiliser. C'est à peu près la seule approbation que je puisse lui donner.

Ming Slogar
la source
1
Pourriez-vous partager la taille de votre base d'utilisateurs pour ce projet, à peu près?
noseratio
Je n'ai jamais déployé le projet, donc la base d'utilisateurs était nulle. Je n'essayais que des options moi-même.
Ming Slogar
2
J'ai souffert pendant des mois en supportant une application C # basée sur Awesomium; cela peut basculer pour les jeux C ++, mais en C #, le contrôle de leur navigateur est carrément bogué. Le déploiement compliqué (vous avez besoin de leur installateur étrange pour ajouter des éléments dans le GAC), le comportement bogué (parfois il démarre avec un écran noir, l'utilisateur doit redémarrer l'application manuellement) et sa vitesse lente (les pages Web ne s'affichent PAS lors du chargement , il se bloque un peu jusqu'à ce que la page soit complètement / à moitié chargée, et il faut 5 à 10 secondes pour s'initialiser sur une machine
lente
5
Je suis finalement allé avec CefSharp et les résultats étaient incroyables. <100 ms d'initialisation (ie. Instant init) et pas de "bugs". Stuff fonctionne juste. Comme il se doit. De plus, CefSharp n'a PAS besoin d'être ajouté dans le GAC, donc aucune modification du programme d'installation n'est nécessaire. Copiez simplement vos fichiers et c'est parti. Ai-je mentionné que CEF / CefSharp est meilleur que toutes les bibliothèques Mozilla / WebKit C # que j'ai testées? Oh et pour l'amour du ciel, n'utilisez pas IE. Ça marche. Oui, c'est le cas, mais il manque totalement de fonctionnalités et il fonctionne très mal (vitesse).
TheFlash
1
@RobinRodricks Exactement mon expérience aussi. J'ai failli abandonner l'approche, mais j'ai trouvé CefSharp :-) (Et qui se soucie de quelques Mo de plus, ces jours-ci, quand les pilotes d'imprimante viennent sur un DVD :-)?)
Xan-Kun Clark-Davis
4

MISE À JOUR 2018 MAI:

Alternativement, vous pouvez intégrer le navigateur Edge, mais ne ciblant que Windows 10.

Voici la solution.

Rahul
la source
2

J'ai eu le même problème avec mon lecteur RSS WPF, je suis allé à l'origine avec Awesomium (je pense que la version 1.6) Awesomium est génial. Vous bénéficiez de nombreux contrôles pour la mise en cache (images et contenu HTML), l'exécution de JavaScript, l'interception de téléchargements, etc. C'est aussi super rapide. L'isolation du processus signifie que lorsque le navigateur plante, il ne plante pas l'application.

Mais c'est aussi lourd, même la version de version ajoute environ 10 à 15 Mo (je ne me souviens plus du nombre exact) et donc une légère pénalité de démarrage. J'ai alors réalisé que le seul problème que j'avais avec le contrôle du navigateur IE était qu'il rejetterait les erreurs JavaScript de temps en temps. Mais cela a été corrigé avec l'extrait suivant.

J'ai à peine utilisé mon application sur XP ou Vista, mais sur Win 7 et au-dessus, elle ne s'est jamais plantée (du moins pas parce que j'ai utilisé le contrôle du navigateur 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
la source
Merci d'avoir répondu. Alors, vous êtes finalement retourné à IE d'Awesomium?
noseratio
Oui je l'ai fait. et j'ai été heureux. J'utilise ClickOnce donc le déployable était minuscule et pas de gel au démarrage!
Sameer Vartak
Merci, j'ai voté pour votre réponse. BTW, il existe un autre moyen d'obtenir l' IWebBrowser2interface interne .
noseratio
Cool. les contrôles Activex fonctionnent-ils dans WPF? Merci pour votre vote :-)
Sameer Vartak
Désolé, je n'ai pas lu attentivement le lien de référence. Oui, c'est un exemple XAML et cela fonctionne. Merci.
Sameer Vartak
1

Microsoft publie le contrôle WPF « Microsoft Edge WebView2 » qui nous offrira une excellente option gratuite pour intégrer Chromium dans Windows 10, Windows 8.1 ou Windows 7. Il est disponible via Nuget en tant que package Microsoft.Web.WebView2.

Scottheckel
la source
C'est une excellente option, bien que nous soyons en 2020 et que je recherche aujourd'hui une solution multiplateforme, par exemple Chromely .
noseratio
1
Je pense que cela dépend si vous envisagez d'ajouter un peu de contenu Web à une application de bureau ou à une application de bureau construite comme une application Web. Je pense que vous n'utiliseriez WebView2 que s'il s'agissait d'un petit contenu Web pour une application de bureau.
scottheckel