Optionen zum Einbetten von Chromium anstelle des IE WebBrowser-Steuerelements mit WPF / C #

158

Das Internet Explorer-basierte WPF-WebBrowser-Steuerelement weist einige Tastatur- und Fokusprobleme sowie Probleme mit Speicherverlusten auf . Als alternative Lösung für diese Probleme erwägen wir in unserem WPF / C # -Projekt, das auf der HTML-Bearbeitung basiert, verfügbare Optionen für das Hosten von Chromium anstelle des WebBrowser-Steuerelements. Ähnliche Fragen wurden gefragt , hier zuvor. Ich habe die Antworten gelesen und meine eigenen Nachforschungen angestellt, hoffe jedoch, weitere Rückmeldungen von Personen zu erhalten, die tatsächlich eine der folgenden Optionen in Projekten in Produktionsqualität verwendet haben :

Awesomium und Awesomium.NET

Es sieht sehr passend aus, aber ich mag die Tatsache nicht, dass das Projekt nicht Open Source ist und die vollständige Quelle nicht leicht verfügbar ist. Es könnte auch ein Overkill für unser Projekt sein, da das Rendern außerhalb des Bildschirms nicht etwas ist, von dem wir wirklich abhängen.

Chromium Embedded Framework (CEF) und .NET-Bindungen für CEF

Dies ist wahrscheinlich die beste derzeit verfügbare Option. Das Projekt scheint lebendig und aktiv zu sein und ist derzeit mit Chrome v27 synchronisiert. CEF3 verwendet die Chrome-Multiprozessarchitektur. Es sieht auch wie Adobe es gibt einige Billigung .

Googles Chrome Frame

Während der ursprüngliche Zweck darin bestand, ein HTML5-Plugin für IE und Firefox zu sein, funktioniert es tatsächlich auch als eigenständiges ActiveX-Steuerelement, sodass ich es für die Verwendung mit WPF umschließen konnte. Es stellt eine ausreichende API für die Interaktion mit der inneren Webseite zur Verfügung ( onmessage, addEventListener/removeEventListener, postMessage). Ich bin mir bewusst, dass Google Chrome Frame einstellen wird , aber ich gehe davon aus, dass die Quellen im Chromium-Repository verbleiben. Es sollte nicht schwierig sein, es mit dem neuesten Chromium-Code zu aktualisieren, und wir hätten die volle Kontrolle darüber.

WebKit .NET-Wrapper

Nicht gerade Chrom-basiert und verwendet keine V8-Engine, daher ist dies keine Option.

Gibt es eine andere Option, die ich möglicherweise übersehen habe?

Ich würde mich sehr freuen, wenn jemand seine Erfahrungen mit einer der oben genannten Optionen für ein reales WPF-Projekt in Produktionsqualität teilen würde. Hatten Sie Auswirkungen auf die Integration, Lizenzierung oder Bereitstellung? Danke dir.

[EDITED] Ich möchte mich auch bei artlung dafür bedanken, dass sie dieser Frage durch ein großzügiges Kopfgeldangebot Auftrieb gegeben hat.

noseratio
quelle

Antworten:

124

Sie haben bereits die bemerkenswertesten Lösungen für die Einbettung von Chrom aufgelistet (CEF, Chrome Frame, Awesomium). Es gibt keine wichtigen Projekte mehr.

Es gibt noch das Berkelium- Projekt (siehe Berkelium Sharp und Berkelium Managed ), aber es enthält eine alte Version von Chromium.

CEF ist die beste Wahl - es ist vollständig Open Source und wird regelmäßig aktualisiert. Dies ist die einzige Option, mit der Sie die neueste Version von Chromium einbetten können. Jetzt, da Per Lundberg aktiv an der Portierung von CEF 3 auf CefSharp arbeitet , ist dies die beste Option für die Zukunft. Es gibt auch Xilium.CefGlue , aber dieses bietet eine Low-Level-API für CEF, die an die C-API von CEF bindet. CefSharp hingegen bindet an die C ++ - API von CEF.

Adobe ist nicht der einzige große Player, der CEF verwendet. Weitere bemerkenswerte Anwendungen, die CEF verwenden, finden Sie auf der CEF-Wikipedia-Seite .

Aktualisieren von Chrome Frame ist sinnlos , da das Projekt wurde zurückgezogen .

Zarek Tomczak
quelle
Sie haben auch vergessen zu sagen, dass die Hälfte der Dinge nicht funktioniert. Wie das Löschen von Cookies, Cache. Einstellen von Proxys usw. Verwenden Sie einfach Awesomium und sparen Sie sich die Mühe.
4
Hehe, nette Antwort Czarek, danke für die Anerkennung. :) (hatte das bis jetzt nicht gesehen)
Per Lundberg
4
Hervorzuheben ist natürlich, dass in jedem Open-Source-Projekt möglicherweise Dinge "fehlen". Weder Xilium.CefGlue noch CefSharp sind Ausnahmen von dieser Regel. Das Schöne an Open Source-Inhalten ist, dass Sie tatsächlich (relativ wenig) Zeit damit verbringen können, sich mit einem kleineren Problem zu befassen und Ihre Fehlerbehebung einzubeziehen. Wir sehen das von Zeit zu Zeit mit CefSharp und es ist ziemlich ordentlich.
Per Lundberg
1
Korrigieren Sie mich, wenn ich falsch liege, aber für CefSharp keine DLLs mit mehr als 50 MB erforderlich sind. Das führt zu einem riesigen Installationsaufbau. Die libcef.dll wird als Hauptabhängigkeit aufgeführt und ist 38 MB
Krafty
2
@Krafty Installations-Setups ermöglichen das Packen mit Algorithmen wie 7z. Dies führt zu einer Reduzierung der Größe von 55 MB -> auf 17 MB. Die CefSharp-Größe ist im Vergleich zu Google Chrome, das 152 MB entpackt und 40 MB Setup gepackt ist, nicht viel.
Czarek Tomczak
11

Wir hatten vor einiger Zeit genau die gleiche Herausforderung. Wir wollten mit der Open-Source-Bibliothek CEF3 arbeiten, die WPF-basiert ist und .NET 3.5 unterstützt.

Zum einen aufgelistet Autor von CEF sich für verschiedene Sprachen verbindlich hier .

Zweitens haben wir die Open-Source-CEF3-Bindung .NET CEF3 mit dem Namen Xilium.CefGlue eingeführt und damit einen guten Erfolg erzielt . In Fällen, in denen etwas nicht wie erwartet funktioniert, reagiert der Autor normalerweise sehr schnell auf die Probleme, die im integrierten Bitbucket-Tracker auftreten

Bisher hat es uns gut gedient. Der Autor aktualisiert seine Bibliothek, um die neuesten CEF3-Versionen und Fehlerbehebungen regelmäßig zu unterstützen.

Artem
quelle
2
Dies ist eigentlich ein Punkt (von "der anderen Seite", da dies CefSharp ist) - CefSharp ist erst seit einigen Monaten 4.0, da Probleme mit der Unterstützung von 3.5 mit neueren VS-Toolsets auftreten. (VS2010 + kann ältere Frameworks mit C ++ / CLI nicht unterstützen, was ein bisschen traurig ist, weil es uns zwingt, .NET 4 oder eine wirklich alte Visual Studio-Version zu verwenden ...)
Per Lundberg
8

Hier ist noch einer:

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

Dieser basiert ebenfalls auf der neuesten Chrome-Engine, ist jedoch viel einfacher zu verwenden als CEF. Es ist eine einzelne .NET-DLL, auf die Sie einfach verweisen und die Sie verwenden können.

Jason
quelle
Die Unterstützung ist auch fantastisch.
Huseyint
3
Grundlegende Informationen scheinen auf dieser Website zu fehlen - welche Chrome-Version enthält sie?
Czarek Tomczak
2
Oh, nicht frei. NICHT FREI. Was dachten diese Leute? :)
dkellner
Vorab sollte hier angemerkt werden, dass es zwar eine Testversion gibt, diese aber nicht kostenlos ist.
Ewilan
8

Schauen Sie sich die DotNetBrowser- Bibliothek an, die von dem Team entwickelt wurde, dem ich angehöre. Es bietet Chromium-basierte WPF- und WinForms-Browsersteuerelemente, die sich ganz einfach in .NET-Anwendungen einbetten lassen. Es unterstützt alle modernen Webstandards einschließlich HTML5, CSS3 und JavaScript. Die gerenderte Seite sieht genauso aus wie in Google Chrome.

Die Bibliothek erbt die Multiprozessarchitektur von Chromium. Jede Webseite wird in einem separaten Chromium-Prozess gerendert, und die Anwendung funktioniert auch nach einem Absturz des Plugins oder einem anderen unerwarteten Fehler auf der Webseite weiter.

Hier sind einige weitere nützliche Funktionen von DotNetBrowser: Sie können Ladeereignisse abhören, Netzwerkaktivitäten verarbeiten, Proxys konfigurieren, Benutzeraktionen simulieren, mit Cookies arbeiten, auf DOM zugreifen und diese ändern, DOM-Ereignisse abhören, JavaScript aus .NET aufrufen und umgekehrt: Verwenden Sie eine Webkamera und ein Mikrofon auf der Webseite, richten Sie eine WebRTC-basierte Kommunikation ein und vieles mehr .

Weitere Informationen finden Sie in der API-Referenz .

Das folgende Codefragment zeigt, wie Sie eine Browseransicht erstellen, in ein Formular einbetten und eine URL laden:

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

Sobald Sie das obige Beispiel ausgeführt haben, erhalten Sie die folgende Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Die Bibliothek ist kommerziell. Kommerzielle Lizenzen enthalten Support-Pakete für verschiedene Teamgrößen. Es ist auch möglich, den Quellcode der Bibliothek zu erwerben.

Neben einer eigenen Seite ist die Komponente als NuGet-Paket und als VSIX-Paket im Visual Studio Marketplace verfügbar .

Vladimir
quelle
1
sieht gültig aus und ich habe die Testversion in meine App eingebettet. Das einzige Problem ist, dass es sich um ein kommerzielles Produkt handelt und die Lizenz nicht sehr billig ist. Ansonsten sieht es für mich solide aus.
DoronG
Leider ist DotNetBrowser NICHT kostenlos! : /
Deniz
4

Ich habe Awesomium.NET verwendet. Obwohl ich die Tatsache nicht mag, dass es nicht Open Source ist, und auch die Tatsache, dass es eine ziemlich alte Webkit-Rendering-Engine verwendet, ist es wirklich einfach zu bedienen. Das ist ungefähr die einzige Bestätigung, die ich geben kann.

Ming Slogar
quelle
1
Können Sie uns mitteilen, wie groß Ihre Benutzerbasis für dieses Projekt war, nur ungefähr?
Noseratio
Ich habe das Projekt nie bereitgestellt, daher war die Benutzerbasis Null. Ich habe nur selbst mit Optionen experimentiert.
Ming Slogar
2
Ich habe monatelang gelitten, eine Awesomium-basierte C # -App zu unterstützen. Es mag für C ++ - Spiele rocken, aber in C # ist die Browsersteuerung geradezu fehlerhaft. Die komplizierte Bereitstellung (Sie benötigen das seltsame Installationsprogramm, um dem GAC Inhalte hinzuzufügen), das fehlerhafte Verhalten (manchmal wird es mit einem schwarzen Bildschirm gestartet, der Benutzer muss die App manuell neu starten) und die langsame Geschwindigkeit (Webseiten werden beim Laden NICHT angezeigt , es hängt irgendwie, bis die Seite vollständig / halb geladen ist, und es dauert 5-10 Sekunden, um auf einer langsamen Maschine zu initialisieren)
TheFlash
5
Ich habe mich schließlich für CefSharp entschieden und die Ergebnisse waren erstaunlich. <100 ms Initialisierung (dh sofortige Initialisierung) und keine "Fehler". Sachen funktionieren einfach. So wie es sollte. Außerdem muss CefSharp NICHT zum GAC hinzugefügt werden, sodass keine Änderungen am Installationsprogramm erforderlich sind. Kopieren Sie einfach Ihre Dateien und gehen Sie. Habe ich erwähnt, dass CEF / CefSharp besser ist als jede von mir getestete Mozilla / WebKit C # -Bibliothek? Oh und um Himmels willen, benutze keinen IE. Es klappt. Ja, aber es fehlt völlig an Funktionen und es funktioniert sehr schlecht (Geschwindigkeit).
TheFlash
1
@RobinRodricks Genau meine Erfahrung auch. Ich hätte den Ansatz fast aufgegeben, aber dann fand ich CefSharp :-) (Und wen interessieren heutzutage ein paar MB mehr, wenn Druckertreiber auf eine DVD kommen :-)?)
Xan-Kun Clark-Davis
4

UPDATE 2018 MAI:

Alternativ können Sie den Edge-Browser einbetten, jedoch nur Windows 10 als Ziel festlegen.

Hier ist die Lösung.

Rahul
quelle
2

Ich hatte das gleiche Problem mit meinem WPF-RSS-Reader. Ich habe mich ursprünglich für Awesomium entschieden (ich denke, Version 1.6). Awesomium ist großartig. Sie erhalten viel Kontrolle über das Caching (Bilder und HTML-Inhalte), die JavaScript-Ausführung, das Abfangen von Downloads usw. Es ist auch super schnell. Die Prozessisolation bedeutet, dass beim Absturz des Browsers die App nicht abstürzt.

Aber es ist auch schwer, sogar der Release-Build fügt ungefähr 10-15 MB hinzu (ich kann mich nicht an die genaue Anzahl erinnern) und daher eine leichte Startstrafe. Dann wurde mir klar, dass das einzige Problem, das ich mit der IE-Browsersteuerung hatte, darin bestand, dass die JavaScript-Fehler von Zeit zu Zeit ausgelöst wurden. Aber das wurde mit dem folgenden Snippet behoben.

Ich habe meine App unter XP oder Vista kaum benutzt, aber unter Win 7 und höher ist sie nie abgestürzt (zumindest nicht, weil ich die IE-Browsersteuerung verwendet habe).

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
quelle
Danke für die Antwort. Haben Sie sich schließlich von Awesomium wieder dem IE zugewandt?
Noseratio
Ja, habe ich. und ich war glücklich. Ich benutze ClickOnce, daher war das Deployable winzig und kein Start-Freeze!
Sameer Vartak
Danke, ich habe Ihre Antwort positiv bewertet. Übrigens gibt es einen anderen Weg , um die innere IWebBrowser2Schnittstelle zu bekommen .
Noseratio
Cool. Funktionieren Activex-Steuerelemente in WPF? Vielen Dank für die Abstimmung :-)
Sameer Vartak
Entschuldigung, habe den Referenzlink nicht sorgfältig gelesen. Ja, es ist ein XAML-Beispiel und es funktioniert. Vielen Dank.
Sameer Vartak
1

Microsoft veröffentlicht das WPF-Steuerelement " Microsoft Edge WebView2 ", mit dem wir eine großartige, kostenlose Option zum Einbetten von Chromium in Windows 10, Windows 8.1 oder Windows 7 erhalten. Es ist über Nuget als Paket verfügbar Microsoft.Web.WebView2.

scottheckel
quelle
Dies ist eine großartige Option, obwohl es 2020 ist und ich heutzutage nach einer plattformübergreifenden Lösung suchen würde, z . B. Chromely .
noseratio
1
Ich denke, es hängt davon ab, ob Sie einer Desktop-App oder einer Desktop-App, die wie eine Web-App erstellt wurde, ein wenig Web-Material hinzufügen möchten. Ich denke, Sie würden WebView2 nur verwenden, wenn es sich um ein kleines Webmaterial für eine Desktop-App handelt.
Scottheckel