Opcje osadzania Chromium zamiast kontrolki IE WebBrowser z WPF / C #

158

Formant WPF WebBrowser oparty na programie Internet Explorer cierpi na niektóre problemy z klawiaturą i fokusem oraz problemy z wyciekiem pamięci . Jako alternatywne rozwiązanie tych problemów rozważamy dostępne opcje hostowania Chromium zamiast kontrolki WebBrowser w naszym projekcie WPF / C # opartym na edycji HTML. Podobne pytania zostały zapytałem tutaj wcześniej. Przeczytałem odpowiedzi i przeprowadziłem własne badania, ale mam nadzieję, że uzyskam więcej informacji zwrotnych od osób, które faktycznie korzystały z którejkolwiek z poniższych opcji w projektach o jakości produkcyjnej :

Awesomium i Awesomium.NET

Wygląda to bardzo dobrze, ale nie podoba mi się fakt, że projekt nie jest open-source, a pełne źródło nie jest łatwo dostępne. Ponadto może to być przesada dla naszego projektu, ponieważ renderowanie poza ekranem nie jest czymś, na czym tak naprawdę polegamy.

Chromium Embedded Framework (CEF) i powiązania .NET dla CEF

Jest to prawdopodobnie najlepsza obecnie dostępna opcja. Projekt wydaje się być żywy i aktywny, obecnie jest zsynchronizowany z Chrome v27. CEF3 wykorzystuje architekturę wieloprocesową Chrome. Wygląda również na to, że Adobe udziela mu poparcia .

Google Chrome Frame

Chociaż pierwotnym celem była wtyczka HTML5 dla IE i Firefoksa, w rzeczywistości działa również jako samodzielna kontrolka ActiveX, więc mogłem ją opakować do użytku z WPF. Udostępnia wystarczający interfejs API do interakcji z wewnętrzną stroną internetową ( onmessage, addEventListener/removeEventListener, postMessage). Wiem, że Google zaprzestaje działalności Chrome Frame, ale zakładam, że źródła pozostaną w repozytorium Chromium. Nie powinno być trudno zaktualizować go najnowszym kodem Chromium na bieżąco i mielibyśmy nad tym pełną kontrolę.

Opakowanie WebKit .NET

Niezupełnie oparty na Chromium i nie używa silnika V8, więc tak naprawdę nie jest to opcja.

Czy jest jakaś inna opcja, którą mogłem przeoczyć?

Byłbym bardzo wdzięczny, gdyby ktoś podzielił się swoim doświadczeniem z którąkolwiek z powyższych opcji dla rzeczywistego projektu WPF o jakości produkcyjnej. Czy masz jakiekolwiek konsekwencje związane z integracją, licencjonowaniem lub wdrożeniem? Dziękuję Ci.

[ZMIENIONO] Chciałbym również podziękować artlungowi za przyspieszenie tego pytania, oferując hojną ofertę nagród.

noseratio
źródło

Odpowiedzi:

124

Wymieniłeś już najbardziej godne uwagi rozwiązania do osadzania Chromium (CEF, Chrome Frame, Awesomium). Nie ma już projektów, które mają znaczenie.

Nadal istnieje projekt Berkelium (patrz Berkelium Sharp i Berkelium Managed ), ale zawiera on starą wersję Chromium.

CEF to najlepszy wybór - jest w pełni open source i często aktualizowany. To jedyna opcja, która umożliwia osadzenie najnowszej wersji Chromium. Teraz, gdy Per Lundberg aktywnie pracuje nad przeniesieniem CEF 3 na CefSharp , jest to najlepsza opcja na przyszłość. Jest też Xilium.CefGlue , ale ten dostarcza API niskiego poziomu dla CEF, wiąże się z API C w CEF. Z drugiej strony CefSharp wiąże się z interfejsem API C ++ w CEF.

Adobe nie jest jedynym dużym graczem używającym CEF, zobacz inne godne uwagi aplikacje używające CEF na stronie Wikipedii CEF .

Aktualizowanie Chrome Frame nie ma sensu, ponieważ projekt został wycofany .

Czarek Tomczak
źródło
Zapomniałeś też powiedzieć, że połowa rzeczy nie będzie działać ... jak czyszczenie plików cookie, pamięć podręczna ... ustawianie serwerów proxy itp. Po prostu użyj Awesomium i zaoszczędź sobie kłopotów.
4
Hej, miła odpowiedź Czarek, dzięki za kredyt. :) (nie widziałem tego do tej pory)
Per Lundberg
4
Oczywiście, na co warto zwrócić uwagę: w każdym projekcie o otwartym kodzie źródłowym może być rzeczy „brakujących”. Ani Xilium.CefGlue, ani CefSharp nie są wyjątkami od tej reguły. Zaletą rzeczy o otwartym kodzie źródłowym jest to, że możesz poświęcić (dość mało) czasu na przyjrzenie się mniejszemu problemowi i uzyskać dołączoną poprawkę. Widzimy to od czasu do czasu w CefSharp i jest całkiem fajny.
Per Lundberg
1
Popraw mnie, jeśli się mylę, ale CefSharp nie wymaga bibliotek DLL o rozmiarze ponad 50 MB? Powoduje to gigantyczną konfigurację instalacji. Biblioteka libcef.dll jest wymieniona jako główna zależność i zajmuje 38 MB
Krafty,
2
Konfiguracja @Krafty pozwala na spakowanie go przy użyciu algorytmów takich jak 7z, co powoduje zmniejszenie rozmiaru z 55 MB -> do 17 MB. Rozmiar CefSharp to niewiele w porównaniu z Google Chrome, który ma 152 MB po rozpakowaniu i 40 MB po spakowaniu konfiguracji.
Czarek Tomczak
11

Dokładnie to samo wyzwanie mieliśmy jakiś czas temu. Chcieliśmy korzystać z biblioteki open source CEF3 opartej na WPF i obsługującej .NET 3.5.

Po pierwsze, autor CEF sam wymienione wiążące dla różnych języków tutaj .

Po drugie, zdecydowaliśmy się na rozwiązanie open source .NET CEF3, które nazywa się Xilium.CefGlue i odniosło z nim dobry sukces. W przypadkach, gdy coś nie działa tak, jak można się spodziewać, autor zazwyczaj bardzo reaguje na problemy otwarte w wbudowanym narzędziu do śledzenia bitbucketów

Jak dotąd dobrze nam służył. Autor aktualizuje swoją bibliotekę, aby regularnie obsługiwać najnowsze wydania CEF3 i poprawki błędów.

Artem
źródło
2
Właściwie to jest punkt (pochodzący z "drugiej strony", w tym CefSharp) - CefSharp jest 4.0 dopiero od kilku miesięcy, z powodu problemów z obsługą 3.5 w nowszych zestawach narzędzi VS. (VS2010 + nie obsługuje starszych frameworków z C ++ / CLI, co jest trochę smutne, ponieważ zmusza nas do korzystania z .NET 4 lub naprawdę starej wersji Visual Studio ...)
Per Lundberg
8

Oto kolejny:

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

Ten jest również oparty na najnowszym silniku Chrome, ale jest znacznie łatwiejszy w użyciu niż CEF. Jest to pojedynczy plik dll .NET, do którego można po prostu odwoływać się i używać.

Jason
źródło
Wsparcie też jest fantastyczne.
huseyint
3
Wydaje się, że na tej stronie brakuje podstawowych informacji - jaką wersję Chrome zawiera?
Czarek Tomczak
2
Och, och, nie za darmo. NIE DARMOWY. Co myśleli ci faceci? :)
dkellner
Należy tu na początku stwierdzić, że chociaż istnieje wersja próbna, nie jest ona bezpłatna.
ewilan
8

Zapoznaj się z biblioteką DotNetBrowser opracowaną przez zespół, do którego należę. Zapewnia oparte na Chromium kontrolki przeglądarki WPF i WinForms, które można dość łatwo osadzić w aplikacji .NET. Obsługuje wszystkie nowoczesne standardy internetowe, w tym HTML5, CSS3 i JavaScript. Wyrenderowana strona wygląda dokładnie tak, jak w Google Chrome.

Biblioteka dziedziczy architekturę wieloprocesową Chromium - każda strona internetowa jest renderowana w osobnym procesie Chromium, a aplikacja będzie działać nawet po awarii wtyczki lub innym nieoczekiwanym błędzie na stronie internetowej.

Oto kilka innych przydatnych funkcji dostarczanych przez DotNetBrowser: można słuchać zdarzeń ładowania, obsługiwać aktywność sieciową, konfigurować proxy, symulować działania użytkownika, pracować z plikami cookie, uzyskiwać dostęp i modyfikować DOM, nasłuchiwać zdarzeń DOM, wywoływać JavaScript z .NET i odwrotnie, użyj kamery internetowej i mikrofonu na stronie internetowej, skonfiguruj komunikację opartą na WebRTC i nie tylko .

Sprawdź Reference API dla więcej szczegółów.

Poniższy fragment kodu pokazuje, jak utworzyć BrowserView, osadzić go w formularzu i załadować adres 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");
        }
    }
}

Po uruchomieniu powyższego przykładu otrzymasz następujące dane wyjściowe:

wprowadź opis obrazu tutaj

Biblioteka ma charakter komercyjny. Licencje komercyjne obejmują pakiety wsparcia dla różnych wielkości zespołów. Istnieje również możliwość zakupu kodu źródłowego biblioteki.

Oprócz własnej strony komponent jest dostępny jako pakiet NuGet i pakiet VSIX w Visual Studio Marketplace.

Vladimir
źródło
1
wygląda na prawidłową i umieściłem wersję próbną w mojej aplikacji. Problem w tym, że jest to produkt komercyjny, a licencja nie jest bardzo tania. W przeciwnym razie wygląda na solidną.
DoronG,
Niestety DotNetBrowser NIE jest za darmo! : /
Deniz
4

Użyłem Awesomium.NET. Chociaż nie podoba mi się fakt, że nie jest to oprogramowanie typu open source, a także fakt, że używa dość starego silnika renderującego Webkit, jest naprawdę łatwy w użyciu. To jedyne poparcie, jakie mogę mu dać.

Ming Slogar
źródło
1
Czy mógłbyś podzielić się z grubsza, jak duża była Twoja baza użytkowników dla tego projektu?
noseratio
Tak naprawdę nigdy nie wdrożyłem projektu, więc liczba użytkowników wynosiła zero. Sam eksperymentowałem tylko z opcjami.
Ming Slogar
2
Przez miesiące cierpiałem, wspierając aplikację C # opartą na Awesomium; może działać w grach C ++, ale w C # ich sterowanie przeglądarką jest po prostu błędne. Skomplikowane wdrożenie (potrzebujesz ich dziwnego instalatora, aby dodać rzeczy do GAC), błędne zachowanie (czasami uruchamia się z czarnym ekranem, użytkownik musi ręcznie ponownie uruchomić aplikację) i jego powolną prędkość (strony internetowe NIE wyświetlają się podczas ładowania , trochę się zawiesza, dopóki strona nie zostanie w pełni / w połowie załadowana, a inicjalizacja na
powolnej
5
W końcu zdecydowałem się na CefSharp i wyniki były niesamowite. <100 ms inicjalizacji (tj. Natychmiastowa inicjalizacja) i żadnych "błędów". Rzeczy po prostu działają. Jak powinno. Ponadto CefSharp NIE musi być dodawany do GAC, więc nie są potrzebne żadne zmiany instalatora. Po prostu skopiuj pliki i gotowe. Czy wspomniałem, że CEF / CefSharp jest lepszy niż każda testowana biblioteka Mozilla / WebKit C #? Aha i na miłość boską nie używaj IE. To działa. Tak, ale jest całkowicie pozbawiony funkcji i działa bardzo źle (szybkość).
TheFlash
1
@RobinRodricks Dokładnie też moje doświadczenie. Prawie zrezygnowałem z tego podejścia, ale potem znalazłem CefSharp :-) (A kogo to obchodzi o kilka MB więcej, w dzisiejszych czasach, kiedy sterowniki drukarki są na DVD :-)?)
Xan-Kun Clark-Davis
4

UPDATE 2018 MAJ:

Alternatywnie możesz osadzić przeglądarkę Edge, ale kierować tylko na okna 10.

Oto rozwiązanie.

Rahul
źródło
2

Miałem ten sam problem z moim czytnikiem WPF RSS, początkowo wybrałem Awesomium (myślę, że wersja 1.6) Awesomium jest świetne. Masz dużą kontrolę nad buforowaniem (obrazy i zawartość HTML), wykonywaniem JavaScript, przechwytywaniem pobierania i tak dalej. Jest też super szybki. Izolacja procesów oznacza, że ​​awaria przeglądarki nie powoduje awarii aplikacji.

Ale jest też ciężki, nawet wersja wydania dodaje około 10-15 MB (nie pamiętam dokładnej liczby), a tym samym niewielką karę za uruchomienie. Wtedy zdałem sobie sprawę, że jedynym problemem, jaki miałem z kontrolą przeglądarki IE, było to, że od czasu do czasu rzucała ona błędy JavaScript. Ale zostało to naprawione za pomocą następującego fragmentu kodu.

Prawie nie korzystałem z mojej aplikacji na XP lub Vista, ale na Win 7 i nowszych nigdy się nie zawiesiła (przynajmniej nie dlatego, że użyłem kontroli przeglądarki 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
źródło
Dziękuję za odpowiedź. Czy w końcu wróciłeś do IE z Awesomium?
noseratio
Tak. i byłem szczęśliwy. Używam ClickOnce, więc wdrażanie było małe i nie zawieszało się przy uruchamianiu!
Sameer Vartak
Dzięki, zagłosowałem za Twoją odpowiedź. Przy okazji, istnieje inny sposób na uzyskanie wewnętrznego IWebBrowser2interfejsu.
noseratio
Chłodny. czy formanty Activex działają w WPF? Dziękujemy za
oddanie
Przepraszamy, nie przeczytałem uważnie linku referencyjnego. Tak, to próbka XAML i działa. Dzięki.
Sameer Vartak
1

Microsoft wypuszcza formant WPF „ Microsoft Edge WebView2 ”, który zapewni nam doskonałą, bezpłatną opcję osadzania Chromium w systemie Windows 10, Windows 8.1 lub Windows 7. Jest ona dostępna w pakiecie za pośrednictwem Nuget Microsoft.Web.WebView2.

scottheckel
źródło
To świetna opcja, choć jest rok 2020 i dziś szukałbym rozwiązania wieloplatformowego, np . Chromely .
noseratio
1
Myślę, że zależy to od tego, czy chcesz dodać trochę rzeczy internetowych do aplikacji komputerowej, czy aplikacji komputerowej zbudowanej jak aplikacja internetowa. Myślę, że używałbyś WebView2 tylko wtedy, gdyby był to mały materiał internetowy do aplikacji komputerowej.
scottheckel