web-dev-qa-db-fra.com

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

Le contrôle WPF WebBrowser basé sur Internet Explorer souffre de certains problèmes de clavier et de focus et problèmes de fuite de mémoire . Comme solution alternative à ces problèmes, nous examinons 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 été posées ici précédemment. J'ai lu les réponses et fait mes propres recherches , mais j'espère obtenir davantage de commentaires de la part des personnes qui ont utilisé l'une des options suivantes dans des projets de qualité 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 une surcharge de notre projet, car le rendu hors écran n'est pas une chose sur laquelle nous comptons vraiment.

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

C'est probablement la meilleure option disponible actuellement. Le projet semble être en vie et actif, étant actuellement synchronisé avec Chrome v27. CEF3 utilise Chrome architecture multi-processus. Il semblerait également que Adobe l’a donné ne certaine approbation .

Google Chrome Frame

Alors que son objectif initial était de devenir un plug-in HTML5 pour IE et Firefox, il fonctionne également comme un contrôle ActiveX autonome, ce qui m'a permis de l'envelopper pour l'utiliser avec WPF. Il expose une API suffisante pour une interaction avec la page Web interne (onmessage, addEventListener/removeEventListener, postMessage). Je suis conscient 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.

wrapper .NET WebKit

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'ai peut-être négligée?

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

[MODIFIÉ] Je voudrais également remercier artlung d'avoir dynamisé cette question en proposant une offre de primes généreuse.

153
noseratio

Vous avez déjà énuméré les solutions les plus remarquables pour l’intégration de chrome (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 Géré ), mais il contient une ancienne version de Chromium.

CEF est votre meilleur choix - il est entièrement open source et mis à jour fréquemment. 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 existe également Xilium.CefGlue , mais celui-ci fournit une API de bas niveau pour CEF, il se lie à l'API C de CEF. CefSharp, par contre, se lie à l'API C++ de CEF.

Adobe n’est pas le seul acteur majeur utilisant CEF, consultez d’autres applications notables utilisant CEF sur le page de CEF wikipedia .

Mettre à jour Chrome Frame est inutile puisque le projet a été retiré .

117
Czarek Tomczak

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

Tout d’abord, l’auteur de CEF a lui-même énuméré les liens pour différentes langues ici .

Deuxièmement, nous avons opté pour la liaison .NET CEF3 à code source ouvert, appelée Xilium.CefGlue , et avons obtenu de bons résultats. Dans les cas où quelque chose ne fonctionne pas comme prévu, l'auteur réagit généralement très bien aux problèmes ouverts dans la version intégrée suivi de bitbucket

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

11
Artem

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 simple DLL .NET que vous pouvez simplement référencer et utiliser.

9
Jason

Jetez un coup d'œ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 une application .NET. Il prend en charge toutes les normes Web modernes, y compris HTML5, CSS3 et JavaScript. La page rendue ressemble exactement à celle de 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 continue de fonctionner même après la panne du plug-in ou toute autre erreur inattendue sur la page Web.

DotNetBrowser fournit d’autres fonctionnalités utiles: il est possible d’écouter des événements de charge, de gérer l’activité du réseau, de configurer un proxy, de simuler les actions de l’utilisateur, de travailler avec des cookies, d’accéder et de modifier DOM, d’écouter des événements DOM, d’appeler JavaScript depuis .NET. et inversement, utilisez la caméra Web et le microphone sur la page Web, configurez la communication WebRTC et plus .

Consultez le Référence de l'API pour plus de détails.

L'extrait de code ci-dessous montre comment créer un BrowserView, l'intégrer à 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 avez exécuté l'exemple ci-dessus, vous obtiendrez le résultat suivant:

enter image description here

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

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

8
Vladimir

J'ai utilisé Awesomium.NET. Bien que je n'aime pas le fait que ce ne soit pas du tout open-source, ni le fait qu'il utilise un moteur de rendu Webkit très ancien, il est vraiment facile à utiliser. C'est à peu près le seul soutien que je puisse lui donner.

5
Ming Slogar

MISE À JOUR 2018 MAI:

Vous pouvez également intégrer le navigateur Edge, mais uniquement en ciblant Windows 10.

Voici la solution.

3
Rahul

J'ai eu le même problème avec mon lecteur de WPF RSS, je suis allé avec Awesomium (je pense que la version 1.6) Awesomium est génial. Vous disposez de beaucoup de contrôle 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 des processus signifie que, lorsque le navigateur se bloque, l'application ne se bloque pas.

Mais c'est aussi lourd, même la version finale ajoute environ 10-15mb (je ne me souviens pas du nombre exact) et donc une légère pénalité de démarrage. Je me suis alors rendu compte que le seul problème que je rencontrais avec le contrôle du navigateur IE était qu'il jetait les erreurs JavaScript de temps à autre. Mais cela a été corrigé avec l'extrait suivant.

J'ai à peine utilisé mon application sur XP ou Vista, mais elle ne s'est jamais effondrée sous Win 7 et au-delà (du moins pas parce que j'ai utilisé le contrôle de 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 });
    }
}
2
Sameer Vartak