479 Stimmen

Ersetzen des .NET WebBrowser-Steuerelements durch einen besseren Browser, wie Chrome?

Gibt es eine relativ einfache Möglichkeit, einen modernen Browser in eine .NET-Anwendung einzufügen?

Soweit ich das verstanden habe, ist die WebBrowser Steuerelement ist ein Wrapper für IE was kein Problem wäre, wenn es nicht so aussehen würde, als sei es eine sehr alte Version von IE mit all den damit verbundenen CSS-Fehlern, potenziellen Sicherheitsrisiken (wenn die Rendering-Engine nicht gepatcht wurde, kann ich dann wirklich erwarten, dass die zahllosen Pufferüberlauf-Probleme behoben werden?) und anderen Problemen.

Ich verwende Visual Studio C# (Expressausgabe - macht das hier einen Unterschied?)

Ich würde gerne einen guten Webbrowser in meine Anwendungen integrieren. In einigen verwende ich es nur, um die Benutzerregistrierung zu behandeln, Schnittstelle mit einigen meiner Website-Funktionen und andere Dinge dieser Reihenfolge, aber ich habe eine andere Anwendung im Auge, die mehr äh erfordern wird... Kontrolle.

Ich brauche:

  • Ein Browser, der in ein Fenster meiner Anwendung integriert werden kann (kein separates Fenster)
  • Eine gute Unterstützung für CSS, js und andere Webtechnologien, die mit jedem modernen Browser gleichwertig ist
  • Grundlegende Browserfunktionen wie "Navigieren", "Zurück", "Neu laden"...
  • Freier Zugriff auf den Seitencode und die Ausgabe.

Ich habe an Chrome gedacht, da er unter der BSD-Lizenz steht, aber ich wäre auch mit einer aktuellen Version des IE zufrieden.

Ich möchte die Dinge so einfach wie möglich halten. Am besten wäre es, wenn man die bestehenden WebBrowser Kontrolle, die bereits etwa 70 % von dem abdeckt, was ich brauche, aber ich glaube nicht, dass das möglich ist.

Ich habe ein ActiveX-Steuerelement für Mozilla gefunden ( http://www.iol.ie/~locka/mozilla/control.htm ), aber es scheint sich um eine alte Version zu handeln, so dass es nicht unbedingt eine Verbesserung darstellt.

Ich bin offen für Vorschläge

194voto

chillitom Punkte 23318

Kasse CefSharp .net bindings, ein Projekt, das ich vor einiger Zeit begonnen habe und das dankenswerterweise von der Community aufgegriffen und in etwas Wunderbares verwandelt wurde.

Das Projekt umfasst die Eingebettetes Chromium-Framework und wurde in einer Reihe von großen Projekten verwendet, darunter der Windows-Client von Rdio, Facebook Messenger für Windows und Github für Windows.

Es bietet Browser-Kontrollen für WPF y Winforms und verfügt über eine Vielzahl von Funktionen und Erweiterungsmöglichkeiten. Da es auf Chromium basiert, ist es auch blitzschnell.

Holen Sie es sich von NuGet: Install-Package CefSharp.Wpf o Install-Package CefSharp.WinForms

Schauen Sie sich die Beispiele an und geben Sie Ihre Gedanken/Feedback/Pull-Anfragen ab: https://github.com/cefsharp/CefSharp

BSD-Lizenziert

84voto

Chris S Punkte 63542

Chrome verwendet (eine Abspaltung von) Webkit, falls Sie das nicht wussten, das auch von Safari verwendet wird. Hier sind ein paar Fragen, die von der gleichen Ader sind:

Die Webkit-Version ist nicht gut, wie die andere Antwort besagt, eine Version funktioniert nicht mehr (die Google-Code-Version) und die Mono-Version ist experimentell. Es wäre schön, wenn sich jemand die Mühe machen würde, einen anständigen .NET-Wrapper dafür zu machen, aber das scheint niemand tun zu wollen - was überraschend ist, da es jetzt Unterstützung für HTML5 und so viele andere Funktionen hat, die der IE(8)-Engine fehlen.

Aktualisierung (2014)

Es gibt ein neues Projekt mit Doppellizenz, mit dem Sie Chrome in Ihre .NET-Anwendungen einbetten können. Awesomium . Es kommt mit einem .NET api, aber erfordert einige Hacks für das Rendering (die Beispiele zeichnen das Browser-Fenster in einen Puffer, malen Sie den Puffer als Bild und aktualisieren Sie auf einen Timer).

I denken Dies ist der von Origin in Battlefield 3 verwendete Browser.

Update (2016)

Es gibt jetzt DotnetBrowser , eine kommerzielle Alternative zu Awesomium. Sie basiert auf Chromium.

68voto

formatc Punkte 4233

Ich habe Alternativen zu C#-Webbrowser-Komponente für ein paar Tage jetzt getestet und hier ist meine Liste:

1. Verwendung neuerer IE-Versionen 8,9:

Webbrowser-Komponente ist IE7 und nicht IE8? Wie kann man das ändern?

Vorteile:

  • Nicht viel Arbeit erforderlich, um es zum Laufen zu bringen
  • einige HTML5/CSS3-Unterstützung bei IE9, vollständige Unterstützung bei IE10

Nachteile:

  • Auf dem Zielcomputer muss die Ziel-IE-Version installiert sein, IE10 ist unter Win7 noch in der Vorschau.

Dies erfordert nicht viel Arbeit und Sie können einige HTML5- und CSS3-Unterstützung erhalten, obwohl dem IE9 einige der besten CSS3- und HTML5-Funktionen fehlen. Aber ich bin sicher, dass man den IE10 auf die gleiche Weise zum Laufen bringen kann. Das Problem wäre, dass auf dem Zielsystem der IE10 installiert sein müsste, und da er unter Windows 7 noch in der Vorschau ist, würde ich davon abraten.

2. OpenWebKitSharp

OpenWebKitSharp ist ein .net-Wrapper für die Webkit-Engine, die auf dem WebKit.NET 0.5-Projekt basiert. WebKit ist eine Layout-Engine, die von Chrome/Safari

Vorteile:

  • Aktiv entwickelt
  • HTML5/CSS3-Unterstützung

Nachteile:

  • Viele Funktionen nicht implementiert
  • Unterstützt nicht x64 (App muss für x86 erstellt werden)

OpenWebKit ist ganz nett, obwohl viele Funktionen noch nicht implementiert sind, erlebte ich einige Probleme mit es mit Visual Studio, die Null-Objekt-Referenz hier und dann im Design-Modus wirft, gibt es einige js Probleme. Jeder, der es verwendet, wird fast sofort bemerken, dass js alert nichts tut. Ereignisse wie mouseup, mousedown... etc. funktionieren nicht, js drag and drop ist buggy und so weiter.

Ich hatte auch einige Schwierigkeiten bei der Installation, da eine bestimmte Version von VC Redistributable installiert sein muss, also habe ich nach der Ausnahme im Ereignisprotokoll nachgesehen, die Version von VC gefunden und sie installiert.

3. GeckoFX

Vorteile:

  • Funktioniert auf Mono
  • Aktiv entwickelt
  • HTML5/CSS3-Unterstützung

Nachteile:

  • Unterstützt nicht x64 (App muss für x86 erstellt werden) - siehe Kommentare unten

GeckoFX ist ein plattformübergreifendes Webbrowser-Steuerelement zur Einbettung in WinForms-Anwendungen. Es kann mit .NET auf Windows und mit mono auf Linux verwendet werden. Gecko ist eine Layout-Engine, die von Firefox verwendet wird.

Ich stieß auf einige Informationen, dass GeckoFX nicht aktiv entwickelt wird, was nicht stimmt, natürlich ist es immer ein oder zwei Versionen hinter Firefox, aber das ist normal, ich war wirklich beeindruckt von der Aktivität und der Steuerung selbst. Es tut alles, was ich brauchte, aber ich brauchte einige Zeit, um es zum Laufen zu bringen, hier ist ein kleines Tutorial, um es zum Laufen zu bringen:

  1. Herunterladen GeckoFx-Windows-16.0-0.2 , hier können Sie prüfen, ob neuere Versionen verfügbar sind GeckoFX
  2. Hinzufügen von Verweisen auf zwei heruntergeladene dll's
  3. Da GeckoFX ein Wrapper ist, benötigen Sie XulRunner, gehen Sie zu Liste der Versionen um zu sehen, welche Sie benötigen
  4. Da wir nun wissen, welche Version von XulRunner wir benötigen, gehen wir zu Mozilla XulRunner veröffentlicht gehen Sie zum Versionsordner -> Laufzeiten -> xulrunner-(Ihre_Version).de-US.win32.zip, in unserem Fall xulrunner-16.0.de-US.win32.zip
  5. Entpacken Sie alles und kopieren Sie alle Dateien in Ihren Papierkorb \Debug (oder Freigabe, wenn Ihr Projekt ist auf Freigabe eingestellt)
  6. Gehen Sie zum Visual Studio Designer Ihres Formulars, gehen Sie zur Toolbox, klicken Sie mit der rechten Maustaste hinein -> Elemente auswählen -> Durchsuchen -> Suchen Sie die heruntergeladene GeckoFX Winforms dll-Datei -> OK
  7. Jetzt sollten Sie ein neues Steuerelement GeckoWebBrowser haben

Wenn Sie unbedingt Chrome verwenden müssen, sehen Sie sich dieses Produkt an Awesomium Für nicht-kommerzielle Projekte ist es kostenlos, aber die Lizenz kostet einige tausend Dollar für kommerzielle Projekte.

51voto

Ich hatte das gleiche Problem, der WebBrowser war mit einer alten Version des IE, mit einigen googeln kam ich auf den folgenden Code, der eine Änderung in der Registrierung macht und macht den WebBrowser, um die neueste IE-Version möglich zu verwenden:

 public enum BrowserEmulationVersion
    {
        Default = 0,
        Version7 = 7000,
        Version8 = 8000,
        Version8Standards = 8888,
        Version9 = 9000,
        Version9Standards = 9999,
        Version10 = 10000,
        Version10Standards = 10001,
        Version11 = 11000,
        Version11Edge = 11001
    }
    public static class WBEmulator
    {
        private const string InternetExplorerRootKey = @"Software\Microsoft\Internet Explorer";

        public static int GetInternetExplorerMajorVersion()
        {
            int result;

            result = 0;

            try
            {
                RegistryKey key;

                key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey);

                if (key != null)
                {
                    object value;

                    value = key.GetValue("svcVersion", null) ?? key.GetValue("Version", null);

                    if (value != null)
                    {
                        string version;
                        int separator;

                        version = value.ToString();
                        separator = version.IndexOf('.');
                        if (separator != -1)
                        {
                            int.TryParse(version.Substring(0, separator), out result);
                        }
                    }
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }
        private const string BrowserEmulationKey = InternetExplorerRootKey + @"\Main\FeatureControl\FEATURE_BROWSER_EMULATION";

        public static BrowserEmulationVersion GetBrowserEmulationVersion()
        {
            BrowserEmulationVersion result;

            result = BrowserEmulationVersion.Default;

            try
            {
                RegistryKey key;

                key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
                if (key != null)
                {
                    string programName;
                    object value;

                    programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
                    value = key.GetValue(programName, null);

                    if (value != null)
                    {
                        result = (BrowserEmulationVersion)Convert.ToInt32(value);
                    }
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }
        public static bool SetBrowserEmulationVersion(BrowserEmulationVersion browserEmulationVersion)
        {
            bool result;

            result = false;

            try
            {
                RegistryKey key;

                key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);

                if (key != null)
                {
                    string programName;

                    programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);

                    if (browserEmulationVersion != BrowserEmulationVersion.Default)
                    {
                        // if it's a valid value, update or create the value
                        key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
                    }
                    else
                    {
                        // otherwise, remove the existing value
                        key.DeleteValue(programName, false);
                    }

                    result = true;
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }

        public static bool SetBrowserEmulationVersion()
        {
            int ieVersion;
            BrowserEmulationVersion emulationCode;

            ieVersion = GetInternetExplorerMajorVersion();

            if (ieVersion >= 11)
            {
                emulationCode = BrowserEmulationVersion.Version11;
            }
            else
            {
                switch (ieVersion)
                {
                    case 10:
                        emulationCode = BrowserEmulationVersion.Version10;
                        break;
                    case 9:
                        emulationCode = BrowserEmulationVersion.Version9;
                        break;
                    case 8:
                        emulationCode = BrowserEmulationVersion.Version8;
                        break;
                    default:
                        emulationCode = BrowserEmulationVersion.Version7;
                        break;
                }
            }

            return SetBrowserEmulationVersion(emulationCode);
        }
        public static bool IsBrowserEmulationSet()
        {
            return GetBrowserEmulationVersion() != BrowserEmulationVersion.Default;
        }
    } 

Sie müssen nur eine Klasse erstellen und diesen Code darin einfügen, dann führen Sie den folgenden Code aus, wenn das Programm startet:

 if (!WBEmulator.IsBrowserEmulationSet())
            {
                WBEmulator.SetBrowserEmulationVersion();
            }

VB.NET:

Imports Microsoft.Win32
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Security
Imports System.Text
Imports System.Threading.Tasks

Public Enum BrowserEmulationVersion
    [Default] = 0
    Version7 = 7000
    Version8 = 8000
    Version8Standards = 8888
    Version9 = 9000
    Version9Standards = 9999
    Version10 = 10000
    Version10Standards = 10001
    Version11 = 11000
    Version11Edge = 11001
End Enum

Public Class WBEmulator
    Private Const InternetExplorerRootKey As String = "Software\Microsoft\Internet Explorer"
    Public Shared Function GetInternetExplorerMajorVersion() As Integer

        Dim result As Integer

        result = 0

        Try
            Dim key As RegistryKey
            key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey)
            If key IsNot Nothing Then
                Dim value As Object = If(key.GetValue("svcVersion", Nothing), key.GetValue("Version", Nothing))

                Dim Version As String
                Dim separator As Integer
                Version = value.ToString()
                separator = Version.IndexOf(".")
                If separator <> -1 Then
                    Integer.TryParse(Version.Substring(0, separator), result)
                End If
            End If

        Catch ex As SecurityException
            'The user does Not have the permissions required to read from the registry key.
        Catch ex As UnauthorizedAccessException
            'The user does Not have the necessary registry rights.
        Catch

        End Try
        GetInternetExplorerMajorVersion = result
    End Function
    Private Const BrowserEmulationKey = InternetExplorerRootKey + "\Main\FeatureControl\FEATURE_BROWSER_EMULATION"

    Public Shared Function GetBrowserEmulationVersion() As BrowserEmulationVersion

        Dim result As BrowserEmulationVersion
        result = BrowserEmulationVersion.Default

        Try
            Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
            If key IsNot Nothing Then
                Dim programName As String
                Dim value As Object
                programName = Path.GetFileName(Environment.GetCommandLineArgs()(0))
                value = key.GetValue(programName, Nothing)
                If value IsNot Nothing Then
                    result = CType(Convert.ToInt32(value), BrowserEmulationVersion)
                End If
            End If
        Catch ex As SecurityException
            'The user does Not have the permissions required to read from the registry key.
        Catch ex As UnauthorizedAccessException
            'The user does Not have the necessary registry rights.
        Catch

        End Try

        GetBrowserEmulationVersion = result
    End Function
    Public Shared Function SetBrowserEmulationVersion(BEVersion As BrowserEmulationVersion) As Boolean

        Dim result As Boolean = False

        Try
            Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
            If key IsNot Nothing Then
                Dim programName As String = Path.GetFileName(Environment.GetCommandLineArgs()(0))
                If BEVersion <> BrowserEmulationVersion.Default Then
                    'if it's a valid value, update or create the value
                    key.SetValue(programName, CType(BEVersion, Integer), RegistryValueKind.DWord)
                Else
                    'otherwise, remove the existing value
                    key.DeleteValue(programName, False)
                End If
                result = True
            End If
        Catch ex As SecurityException

            ' The user does Not have the permissions required to read from the registry key.

        Catch ex As UnauthorizedAccessException

            ' The user does Not have the necessary registry rights.

        End Try

        SetBrowserEmulationVersion = result
    End Function

    Public Shared Function SetBrowserEmulationVersion() As Boolean
        Dim ieVersion As Integer
        Dim emulationCode As BrowserEmulationVersion
        ieVersion = GetInternetExplorerMajorVersion()

        If ieVersion >= 11 Then

            emulationCode = BrowserEmulationVersion.Version11
        Else

            Select Case ieVersion
                Case 10
                    emulationCode = BrowserEmulationVersion.Version10
                Case 9
                    emulationCode = BrowserEmulationVersion.Version9
                Case 8
                    emulationCode = BrowserEmulationVersion.Version8
                Case Else
                    emulationCode = BrowserEmulationVersion.Version7
            End Select
        End If

        SetBrowserEmulationVersion = SetBrowserEmulationVersion(emulationCode)
    End Function

    Public Shared Function IsBrowserEmulationSet() As Boolean
        IsBrowserEmulationSet = GetBrowserEmulationVersion() <> BrowserEmulationVersion.Default
    End Function
End Class

Sie können es wie folgt verwenden:

If Not WBEmulator.IsBrowserEmulationSet() Then
    WBEmulator.SetBrowserEmulationVersion()
End If

32voto

Rahul Punkte 2031

UPDATE 2020 JULI

Auf Chrombasis WebView 2 wird von Microsoft veröffentlicht. Jetzt können Sie den neuen Chromium Edge-Browser in eine .NET-Anwendung einbetten.

UPDATE 2018 MAI

Wenn Ihre Anwendung auf Windows 10 laufen soll, können Sie jetzt den Edge-Browser in Ihre .NET-Anwendung einbetten, indem Sie Windows Community Toolkit .

WPF-Beispiel:

  1. Windows Community Toolkit Nuget-Paket installieren

    Install-Package Microsoft.Toolkit.Win32.UI.Controls
  2. XAML-Code

    <Window
        x:Class="WebViewTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WPF="clr-namespace:Microsoft.Toolkit.Win32.UI.Controls.WPF;assembly=Microsoft.Toolkit.Win32.UI.Controls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:WebViewTest"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        mc:Ignorable="d">
        <Grid>
            <WPF:WebView x:Name="wvc" />
        </Grid>
    </Window>
  3. CS-Code:

    public partial class MainWindow : Window
    {
      public MainWindow()
      {
        InitializeComponent();
    
        // You can also use the Source property here or in the WPF designer
        wvc.Navigate(new Uri("https://www.microsoft.com"));
      }
    }

WinForms Beispiel:

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();

    // You can also use the Source property here or in the designer
    webView1.Navigate(new Uri("https://www.microsoft.com"));
  }
}

Bitte beachten Sie dieser Link für weitere Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X