Sostituire il controllo .NET WebBrowser con un browser migliore, come Chrome?


433

Esiste un modo relativamente semplice per inserire un browser moderno in un'applicazione .NET?

A quanto ho capito, il WebBrowsercontrollo è un wrapper per IE , il che non sarebbe un problema, tranne per il fatto che sembra una versione molto vecchia di IE , con tutto ciò che comporta in termini di errori CSS, potenziali rischi per la sicurezza (se il motore di rendering non è stato patchato, posso davvero aspettarmi che vengano risolti i problemi di overflow del buffer di zillion?) e altri problemi.

Sto usando Visual Studio C # (Express Edition - fa qualche differenza qui?)

Vorrei integrare un buon browser Web nelle mie applicazioni. In alcuni, lo uso solo per gestire il processo di registrazione dell'utente, l'interfaccia con alcune delle funzionalità del mio sito Web e altre cose di quell'ordine, ma ho in mente un'altra applicazione che richiederà più controllo err ...

Ho bisogno:

  • Un browser che può integrarsi all'interno di una finestra della mia applicazione (non una finestra separata)
  • Un buon supporto per CSS, js e altre tecnologie web, alla pari con qualsiasi browser moderno
  • Funzioni di base del browser come "navigare", "indietro", "ricaricare" ...
  • Accesso libero al codice della pagina e all'output.

Stavo pensando a Chrome, dal momento che rientra nella licenza BSD, ma sarei altrettanto felice con una versione recente di IE.

Per quanto possibile, vorrei mantenere le cose semplici. La cosa migliore sarebbe se si potesse correggere il WebBrowsercontrollo esistente , che fa già circa il 70% di ciò di cui ho bisogno, ma non credo sia possibile.

Ho trovato un controllo ActiveX per Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm ) ma sembra che sia una versione precedente, quindi non è necessariamente un miglioramento.

Sono aperto ai suggerimenti


19
Perché dici che il controllo WebBrowser utilizza una vecchia versione di IE? Utilizza la versione installata sul sistema dell'utente, sebbene IE8 WebBrowser appaia predefinito al rendering IE7: blogs.msdn.com/ie/archive/2009/03/10/…
Tim Robinson,

17
Perché non sembra così sulla mia macchina. Ho installato IE8 ma il controllo mostra problemi di visualizzazione che non vedo da IE 5. Un modulo di login molto semplice, 2 campi con un tocco di CSS ha un display confuso e alcuni display javascript non funzionano, mentre mostra bene in IE8, Firefox, Chrome, Opera ... quindi ho pensato che il motore di rendering fosse vecchio. Potrei sbagliarmi completamente e forse il problema è in realtà diverso da quello che pensavo.
Sylverdrag,

3
@Sylverdrag: ti sbagli. Utilizza l'ultimo IE sul tuo sistema. Tuttavia, ho letto da qualche parte che il controllo WebBrowser presenta un problema di compatibilità con le versioni precedenti più forte rispetto al browser autonomo. IE8 può avere, ad esempio, un'icona su cui fare clic per attivare la modalità IE7. Come parte del programma, ciò non è possibile, quindi il controllo passa alla modalità precedente per compatibilità. OTOH, non ho letto come impostarlo per utilizzare la "modalità IE8".
John Saunders,

55
In realtà, John Sanders, ti sbagli. Usa ie4 e devi cambiare un valore di registro per dirgli di usare current. Cerca "emulazione modalità funzionalità" e otterrai le tue risposte, modificate di recente, utilizzate per includere la parola chiave native ma l'hanno cambiata, google le parole chiave che ho citato con "controllo webbrowser" e troverai l'articolo msdn.
Erx_VB.NExT.Coder

8
Per impostazione predefinita, un WebBrowsercontrollo ospitato utilizza l'emulazione IE7, se non diversamente specificato con FEATURE_BROWSER_EMULATION. Questo è documentato qui: blogs.msdn.com/b/askie/archive/2009/03/23/…
noseratio,

Risposte:


171

Acquista CefSharp .Net attacchi, un progetto che ho iniziato un po 'indietro che per fortuna è venuto a prendere dalla comunità e trasformato in qualcosa di meraviglioso.

Il progetto include Chromium Embedded Framework ed è stato utilizzato in numerosi progetti importanti tra cui il client Windows di Rdio, Facebook Messenger per Windows e Github per Windows.

È dotato di controlli del browser per WPF e Winforms e ha tonnellate di funzionalità e punti di estensione. Essendo basato su Chromium è anche velocissimo.

Prendi da NuGet: Install-Package CefSharp.WpfoInstall-Package CefSharp.WinForms

Dai un'occhiata agli esempi e dai i tuoi pensieri / feedback / richieste pull: https://github.com/cefsharp/CefSharp

Licenza BSD


2
Sono passato a CEfSharp da OWS e posso affermare con certezza che è di alta qualità e comunità attiva. Lo adoro. github.com/cefsharp/CefSharp
Vin

1
CefSharp è eccezionale, ma tieni presente che le librerie sono di grandi dimensioni (l'ultima volta che ho guardato più di 20 MB) quindi potrebbero non essere adatte a un progetto più leggero.
Skyl3lazer,

1
@ANguyen sì, puoi
chillitom,

1
Molto molto felice di sapere che sei stato tu a iniziare questo progetto! Di recente ho usato cefsharp, tuttavia, ho potuto vedere che la dimensione della libreria è di oltre 80 MB, che è enorme, ma necessaria per il corretto funzionamento (rendering particolarmente fluido) dell'applicazione. C'è un modo per ridurlo?
Aditya Bokade,

5
Questo ha rotto il mio progetto. Tutti i riferimenti sono stati interrotti dopo l'installazione del pacchetto nuget winforms.
toddmo,

84

Chrome utilizza (un fork di) Webkit se non lo sapevi, che viene utilizzato anche da Safari. Ecco alcune domande che sono della stessa vena:

Il webkit non è eccezionale come afferma l'altra risposta, una versione non funziona più (quella di Google Code) e quella Mono è sperimentale. Sarebbe bello se qualcuno facesse lo sforzo di creare un wrapper .NET decente per esso, ma non è qualcosa che qualcuno sembra voler fare - il che è sorprendente dato che ora ha il supporto per HTML5 e tante altre funzionalità che l'IE (8 ) manca il motore.

Aggiornamento (2014)

C'è un nuovo progetto con doppia licenza che ti consente di incorporare Chrome nelle tue applicazioni .NET chiamato Awesomium . Viene fornito con un API .NET ma richiede alcuni hack per il rendering (gli esempi disegnano la finestra del browser su un buffer, dipingono il buffer come un'immagine e si aggiornano su un timer).

Penso che questo sia il browser utilizzato da Origin in Battlefield 3.

Aggiornamento (2016)

Ora c'è DotnetBrowser , un'alternativa commerciale a Awesomium. È basato su Chromium.


Grazie. Darò un'occhiata al wrapper Gecko. Una cosa però, la risposta originale dice "Tutto quello che devi fare è registrare il controllo Mozilla ActiveX" e ho pensato che le edizioni Express non potevano registrare controlli aggiuntivi. Mi sto perdendo qualcosa di ovvio?
Sylverdrag,

4
@Syl le edizioni express possono registrare tutti i controlli di cui hai bisogno. Quello che non faranno è permetterti di installare plugin in Visual Studio.
Joel Coehoorn,

1
Ho avuto esperienze piuttosto brutte nell'uso di WebKit con C # e alla fine ho dovuto accontentarmi del componente predefinito del browser Web fornito con .NET
Sumit Ghosh il

1
A partire da questa data, i progetti di cui sopra non sono sostituti drop-in validi. Errori del compilatore a bizzeffe + instabilità. Awesomium, è spazzatura completa ed assoluta.
Kraang Prime,

"Penso che questo sia il browser utilizzato da Origin in Battlefield 3." Questo non è corretto Lo so perché ho dovuto forzare l'uso di questa app, ad es. Su Windows 10, perché quando per impostazione predefinita non funzionava. Questo era un po 'di tempo fa, forse un problema risolto.
Theyouth è il

64

Sto testando alternative al componente del browser Web C # da alcuni giorni ed ecco il mio elenco:

1. Utilizzando le versioni più recenti di IE 8,9:

Il componente Browser Web è IE7 non IE8? Come cambiarlo?

Professionisti:

  • Non è necessario molto lavoro per farlo funzionare
  • alcuni HTML5 / CSS3 supportano se IE9, pieno se IE10

Contro:

  • Sul computer di destinazione deve essere installata la versione di IE di destinazione, IE10 è ancora in anteprima su Win7

Ciò non richiede molto lavoro e puoi ottenere supporto HTML5 e CSS3 anche se IE9 non ha alcune delle migliori funzionalità CSS3 e HTML5. Ma sono sicuro che potresti far funzionare IE10 allo stesso modo. Il problema sarebbe che il sistema di destinazione dovrebbe avere IE10 installato, e poiché è ancora in anteprima su Windows 7, suggerirei di non farlo.

2. OpenWebKitSharp

OpenWebKitSharp è un wrapper .net per il motore webkit basato sul progetto WebKit.NET 0.5. WebKit è un motore di layout utilizzato da Chrome / Safari

Professionisti:

  • Sviluppato attivamente
  • Supporto HTML5 / CSS3

Contro:

  • Molte funzioni non implementate
  • Non supporta x64 (l'app deve essere creata per x86)

OpenWebKit è abbastanza carino anche se molte funzionalità non sono ancora state implementate, ho riscontrato pochi problemi nell'usarlo con Visual Studio che lancia qui riferimenti a oggetti nulli e quindi in modalità progettazione, ci sono alcuni problemi js. Tutti quelli che lo usano noteranno quasi immediatamente che js alert non fa nulla. Eventi come mouseup, mousedown ... ecc. Non funzionano, js drag and drop è difettoso e così via ...

Ho anche avuto qualche difficoltà a installarlo poiché richiede una versione specifica di VC ridistribuibile installata, quindi dopo un'eccezione ho guardato il registro eventi, ho trovato la versione di VC e l'ho installato.

3. GeckoFX

Professionisti:

  • Funziona su mono
  • Sviluppato attivamente
  • Supporto HTML5 / CSS3

Contro:

  • D̶o̶e̶s̶n̶'̶t̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶x̶6̶4̶ ̶ (̶A̶p̶p̶ ̶m̶u̶s̶t̶ ̶b̶e̶ ̶b̶u̶i̶l̶t̶ ̶f̶o̶r̶ ̶x̶̶̶ see see below below) ̶

GeckoFX è un controllo Webrowser multipiattaforma da incorporare nelle applicazioni WinForms. Questo può essere usato con .NET su Windows e con mono su Linux. Gecko è un motore di layout utilizzato da Firefox.

Ho scoperto poche informazioni sul fatto che GeckoFX non è stato sviluppato attivamente, il che non è vero, ovviamente sono sempre una o due versioni di Firefox, ma è normale, sono rimasto davvero colpito dall'attività e dal controllo stesso. Fa tutto ciò di cui avevo bisogno, ma avevo bisogno di un po 'di tempo per farlo funzionare, ecco un piccolo tutorial per farlo funzionare:

  1. Scarica GeckoFx-Windows-16.0-0.2 , qui puoi verificare se è disponibile una versione più recente di GeckoFX
  2. Aggiungi riferimenti a due DLL scaricate
  3. Poiché GeckoFX è un wrapper, hai bisogno di XulRunner, vai all'Elenco versioni per vedere quale ti serve
  4. Ora che sappiamo di quale versione di XulRunner abbiamo bisogno, andiamo alle versioni di Mozilla XulRunner , andiamo alla cartella della versione -> runtime -> xulrunner- (your_version) .en-US.win32.zip, nel nostro caso xulrunner-16.0.en- US.win32.zip
  5. Decomprimi tutto e copia tutti i file nel tuo bin \ Debug (o rilascia se il tuo progetto è impostato per il rilascio)
  6. Vai al designer di Visual Studio del tuo modulo, vai alla casella degli strumenti, fai clic con il tasto destro all'interno -> Scegli elementi -> Sfoglia -> Trova il file dll di Winforms GeckoFX scaricato -> OK
  7. Ora dovresti avere un nuovo controllo GeckoWebBrowser

Se devi davvero utilizzare Chrome, dai un'occhiata a questo prodotto chiamato Awesomium , è gratuito per progetti non commerciali, ma la licenza è di poche migliaia di dollari per uso commerciale.


4
Ottima descrizione di come far funzionare GeckoFx. +1
Alex Essilfie,

quando ho creato Geckofx-Winforms avevo bisogno di 4 librerie gtk # (atk-sharp, gdk-sharp, glib-sharp e gtk-sharp), quindi ho dovuto installare prima Mono.
bernhardrusch,

Questa risposta è spettacolare.
Mike Cole,

Un'ottima analisi davvero. Volevo sapere se ti è capitato di testare Awesomium con applicazioni C #. Hai qualcosa da dire su questo? Non l'ho ancora testato, ma mi sembra affidabile dopo aver visto il pannello di amministratori che hanno menzionato sulla loro pagina.
Abdul Rehman,

2
@Wayne, se vuoi farlo nel modo giusto, dovresti creare una cartella nel tuo progetto o un progetto distinto in cui includeresti tutti i file, gecko fx dlls e xul runner e li imposti da copiare sempre, quindi ad ogni azione di build che otterrebbero copiato nella cartella build / debug o pubblicato se pubblichi da VS, esiste anche il metodo Xpcom.Initialize che dovresti chiamare e puoi passare il percorso dei file xul runner, spero che ti aiuti
formatc

41

Ho avuto lo stesso problema, il WebBrowser utilizzava una vecchia versione di IE, con alcuni google ho trovato il seguente codice che modifica il registro e rende il WebBrowser utilizza l'ultima versione di IE possibile:

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

Devi solo creare una classe e inserire questo codice, quindi eseguire il codice seguente all'avvio del programma:

 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

Puoi usarlo come:

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

1
Eccellente!! Grazie mille!
Ben

1
Tradotto in Python (lavorando su un'applicazione IronPython) e ha funzionato perfettamente. Grazie!
David,

1
Questo mi salva la vita! Grazie
Neeraj Dubey,

1
Questo è fantastico ma è possibile ripristinare la versione di emulazione? Sembra che la versione possa essere impostata una sola volta in un'applicazione WinForms. Sebbene sia possibile che sembri essere ripristinato, l'effetto è che, una volta impostato e ripristinato nel registro, non viene riletto con i nuovi valori del registro in un'app WinForms.
cymorg,

1
@DarrenMB per quanto ne so usa IE11
Ashkan Mobayen Khiabani,

27

È possibile utilizzare il registro per impostare la versione di IE per il controllo del browser web. Vai a: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION e aggiungi "yourApplicationName.exe" con il valore di browser_emulation Per vedere il valore di browser_emulation, fai riferimento al link: http://msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation


10
E se si sta debug in Visual Studio, probabilmente sarà necessario utilizzare "yourApplicationName.vshost.exe"
newenglander

3
E se stai eseguendo il debug in Visual Studio, probabilmente puoi semplicemente deselezionare "Abilita il processo di hosting di Visual Studio" nella scheda Debug delle proprietà del tuo progetto. Quindi puoi usare il tuo nome exe senza la parte "vshost".
Daniel Vygolov,

1
@golavietnam Puoi aiutarmi per favore con questo, ho provato le tue istruzioni e usando le istruzioni sul link che hai fornito, ma non funziona ancora. Quando visito WhatIsMyBrowser.com usando il controllo del browser web, mi dice che sto usando ie11 MA in modalità di compatibilità ie 7 e molti siti Web si rifiutano di funzionare e mi danno un messaggio "per favore aggiorna il tuo browser". Come posso forzare il controllo del browser web a utilizzare l'ultima versione di ie che è installata (ie11) in questo modo non funziona, l'ho provato cento volte.
jay_t55,

Grazie, ha funzionato e mi ha salvato la giornata
Tấn Nguyên il


16

So che questo non è un controllo "WebBrowser" sostitutivo, ma stavo riscontrando alcuni terribili problemi di rendering mentre mostravo una pagina che utilizzava BootStrap 3+ per il layout, ecc. E poi ho trovato un post che mi suggeriva di usare il seguente. Apparentemente è specifico di IE e gli dice di usare l'ultima variante trovata sul computer client per il rendering (quindi non utilizzerà IE7 come credo sia predefinito)

Quindi basta inserire:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

da qualche parte nella parte principale del documento.

Se ovviamente non è il tuo documento, ovviamente questo non aiuterà (anche se lo considero personalmente un buco nella sicurezza se stai leggendo pagine non create da te tramite il controllo del browser web - perché non usare solo un browser web!)

In bocca al lupo.


Se si desidera che questo lavoro su un PC con IE7, non metterlo da qualche parte in <head>, metterlo come il primo figlio di <head>. Ci è voluto del tempo per capirlo.
Sylvain,

Scusate intendevo IE8 non IE7 nel mio commento precedente. Quindi su IE8, se non si posiziona <meta>come primo figlio di <head>, verrà eseguito in modalità compatibilità, non in modalità edge.
Sylvain,

Stavo usando il plugin webbrowser in un'app winform e questo è stato di grande aiuto. La pagina che stavo colpendo stava usando jquery & angularjs che stava soffocando perché pensava che il browser fosse IE7 anche se ho installato IE10.
Kywillis,

Questo lavoro per me! Puoi anche usarlo per impostare una particolare versione di IE, ad esempio: <meta http-equiv = "X-UA-Compatible" content = "IE = 10" /> e sempre il browser funziona come 10 (ovviamente è necessario avere installato la stessa versione o successiva
freedeveloper

Questo è perfetto per il mio caso d'uso. Voglio mostrare report formattati HTML più belli. Esistono già molti contenuti CSS disponibili. Questo è un approccio migliore rispetto all'incorporamento di chrome / firefox.
MD Luffy,

13

Dai un'occhiata alla libreria DotNetBrowser . Fornisce i controlli del browser WPF e WinForms basati su Chromium, che sono abbastanza facili da integrare nell'applicazione .NET. Supporta tutti i moderni standard Web tra cui HTML5, CSS3 e JavaScript. La pagina di rendering appare esattamente come in Google Chrome.

La libreria eredita l'architettura multi-processo di Chromium: ogni pagina Web viene visualizzata in un processo Chromium separato e l'applicazione continuerà a funzionare anche dopo l'arresto anomalo del plug-in o qualsiasi altro errore imprevisto nella pagina Web.

Ecco alcune altre utili funzioni, fornite da DotNetBrowser: è possibile ascoltare il caricamento di eventi, gestire l'attività di rete, configurare il proxy, simulare azioni dell'utente, lavorare con i cookie, accedere e modificare DOM, ascoltare eventi DOM, chiamare JavaScript da .NET e viceversa, utilizzare la webcam e il microfono sulla pagina Web, impostare la comunicazione basata su WebRTC e altro ancora .

Controlla il riferimento API per maggiori dettagli.

Lo snippet di codice seguente mostra come creare un BrowserView, incorporarlo in un modulo e caricare un 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");
        }
    }
}

Una volta eseguito l'esempio sopra, otterrai il seguente output:

inserisci qui la descrizione dell'immagine

La biblioteca è commerciale. Le licenze commerciali includono pacchetti di supporto per team di diverse dimensioni. È anche possibile acquistare il codice sorgente della biblioteca.

Oltre alla propria pagina, il componente è disponibile come pacchetto NuGet e come pacchetto VSIX nel Visual Studio Marketplace.


16
Fai

3
Non è open source, la sua licenza non è più economica.
Ashish-BeJovial,

8

Ho provato una manciata di varianti di Webkit, ma nella mia esperienza nulla è meglio dei progressi di OpenWebkitSharp . Adoro, adoro ... I punteggi HTML5 e CSS3 sono il più vicino possibile a Google Chrome. API e modello di eventi molto belli. Se trovi le API "non implementate" molto probabilmente perché non sono implementate in Webkit. Tutto il resto funziona alla grande.

OpenWebKitSharp è un wrapper .net per il motore webkit basato sul progetto WebKit.NET 0.5. Aggiunge più funzionalità alla versione 0.5 e fornisce più metodi di quella build. OpenWebKitSharp supporta sia la build Cairo (0,5) che le build notturne di webkit (Nightly per impostazione predefinita). Nella versione 1.5 Stabile e altro la build notturna è inclusa e copiata automaticamente dopo la costruzione. Nelle versioni precedenti questo accade con la build di cairo. OpenWebKitSharp attualmente supporta GTLite Navigator, un browser Web veloce, stabile e flessibile.


1
Grazie. Sembra un'ottima scoperta!
Sylverdrag,

Anche i loro forum sono piuttosto attivi e ho avuto risposte molto veloci alle mie domande. Ora sto usando questo per tutte le mie esigenze di controllo del browser web
Vin

2
Sì, fa tutto ciò che chiami ExecuteScript. Tuttavia sono passato a CefSharp e posso dirti che mi piace molto meglio di OWS
Vin

1
Un altro disgustoso pasticcio di codice che non è praticabile per l'uso di qualsiasi cosa.
Kraang Prime,

1
attenzione webkit non posso usare proxy
sto

7

AGGIORNAMENTO 2018 MAGGIO

Se hai come target l'applicazione da eseguire su Windows 10, ora puoi incorporare il browser Edge nell'applicazione .net utilizzando Windows Community Toolkit .

Esempio di WPF:

1) Installa il pacchetto Nuget di Windows Community Toolkit

Install-Package Microsoft.Toolkit.Win32.UI.Controls

2) Codice XAML

<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) Codice CS:

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

Esempio di WinForms:

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

Si prega di fare riferimento a questo link per ulteriori informazioni.


Ho installato il pacchetto Nuget, ma non funziona. Ancora ty.
Deniz,

6

Prova EO.WebBrowser . È nuovo e si basa sull'ultima versione del browser Chrome. La parte migliore è che racchiude tutto in una singola dll .NET, quindi non solo è molto facile da usare e distribuire, ma anche la stessa DLL supporta sia 32 bit che 64 bit perché è una dll .NET.


9
In futuro, si prega di indicare che si tratta di un prodotto concesso in licenza commerciale e che si abbia o meno un'affiliazione con il prodotto, vedere Evitare l'autopromozione esplicita nelle FAQ.
Andy Brown,

1
Dopo aver cercato come un cappellaio matto per ANNI ---- questo controllo "commerciale" è letteralmente il SOLO sostituto drop-in funzionante per IE con il quale non ho dovuto andare in giro e non ho rovinato nessuno dei miei browser attuali impostazioni. - se contrassegno, NON sono associato a EO in alcun modo forma o forma. Sono incazzato che tutte queste altre soluzioni siano completamente perfette - una spazzatura totale e una completa perdita di tempo per tutti.
Kraang Prime,

@SanuelJackson GeckoFx funziona perfettamente nella mia azienda e non ha causato problemi con le impostazioni del browser
Wayne

@Wayne - è carino per te. Nessuno di questi progetti aperti è un sostituto drop-in che richiede modifiche significative per funzionare come codice gestito, in particolare come controllo drop-in dei moduli. O mancano delle funzionalità offerte dal controllo IE e / o sono complete poiché si bloccano costantemente o sono lente - non possono nemmeno elencare tutti i problemi qui. Forse in un altro decennio in cui Internet non richiede più browser Web, forse qualcosa di praticabile funzionerà.
Kraang Prime,

@SanuelJackson Hmm, vorrei che quello che hai detto fosse vero. Sfortunatamente nessuna delle alternative (incluso GeckoFX) non ha avuto alcun errore di interruzione dello spettacolo per me. Vorrei anche che avrei potuto evitare il prezzo elevato del browser Essential Objects. Ma è stato l'unico che ha funzionato perfettamente per me.
Maiken Roskilde,

5

Ho usato GeckoFX e mi serve molto bene. Utilizza il motore di Firefox. L'unico avvertimento che io abbia mai incontrato è che emette l'evento "DocumentLoaded" una volta prima che il documento sia effettivamente caricato completamente ... Penso che ne spari uno quando l'HTML è caricato, e poi un altro quando tutto il immagini e roba vengono caricate. L'ho risolto semplicemente ignorando il primo, e finora ha funzionato magnificamente senza fallo.

Puoi trovarlo qui: https://bitbucket.org/geckofx/

Come la maggior parte delle librerie decenti, è open source.


2
Tutti i componenti basati su Firefox che funzionano, si rovinano con l'installazione degli utenti di Firefox. Fortunatamente, la maggior parte di queste soluzioni non funziona affatto e, se fortunata, mantiene intatte le impostazioni di Firefox --- non così fortunatamente, perdi tutte le tue impostazioni e non hai ancora niente di meglio di IE come drop-in.
Kraang Prime,

1
Il link è morto e di vecchia generazione. bitbucket.org/geckofx ha la versione attuale
Wayne,

@Sanual Jackson - Ho usato GeckoFx per anni e non ho mai avuto problemi con l'installazione di Firefox dell'utente, incluso il mio. Stai solo indovinando?
PandaWood,

3

MozNet è un controllo .NET, precedentemente basato sul controllo GeckoFX più o meno abbandonato, ma è in pieno sviluppo e ha molte più funzionalità di quelle che GeckoFX può agitare. Puoi trovarlo sul sito web Se7en Soft .


1
GeckoFX è stato attivamente sviluppato su: bitbucket
Wayne,


2

Aggiornamento 2016:

Ci sono 3 opzioni aggiuntive che posso suggerire:

1. BrowseEmAll.Cef

Un componente .Net che può essere utilizzato per integrare il motore Chrome nella tua applicazione .Net. Basato su CefGlue ma un po 'più veloce sugli aggiornamenti all'ultima versione di Chrome. Inoltre è disponibile un'opzione di supporto commerciale che potrebbe tornare utile per alcuni. Naturalmente il componente stesso è open source .

2. BrowseEmAll.Gecko

Un altro componente .Net che può essere utilizzato per integrare il motore Firefox nella tua applicazione .Net. Questo si basa su Geckofx ma a differenza della versione corrente di Geckofx funzionerà con una normale versione di Firefox. Per usare Geckofx dovrai creare tu stesso Firefox. Anche in questo caso è disponibile il supporto commerciale, ma il componente stesso è completamente open source .

3. BrowseEmAll Core API

Hai bisogno di tutti i diversi browser nella tua applicazione .Net? Quale API di BrowseEmAll Core puoi integrare Chrome, Firefox, Webkit e Internet Explorer nella tua applicazione. Questo è un prodotto commerciale, quindi attenzione.

(Informativa completa: lavoro per questa azienda, quindi prendi tutto ciò che dico con un granello di sale)



1

Se stai cercando un controllo basato su IE, consulta: http://code.google.com/p/csexwb2/

L'ho usato nei prodotti di produzione. È abbastanza buono e ha buone demo anche se non sembra essere mantenuto come adesso.


1

Geckofx e Webkit.net erano entrambi promettenti all'inizio, ma non si sono aggiornati con Firefox e Chrome rispettivamente mentre Internet Explorer è migliorato, così ha fatto controllare Webbrowser, sebbene si comporti come IE7 per impostazione predefinita indipendentemente dalla versione di IE ma ciò può essere risolto accedendo al registro e modificandolo in IE9 consentendo HTML5.



0

Ho provato tutti i browser che sono là fuori. Purtroppo l'unico che ha funzionato davvero per me in tutte le circostanze è stato EO.Browser. Vorrei poter scegliere una soluzione gratuita, ma ho finito con EO.Browser. È piuttosto caro, ma ben mantenuto.


0

Aggiornamento 2016:

Per me, l'unica alternativa affidabile e mantenuta del browser a IE è EO.WebBrowser. Ho trascorso giorni e settimane a provare gli altri. Tutti hanno avuto alcuni problemi che hanno interrotto lo spettacolo per me ad un certo punto.


1
Beh ... ho fatto uno scherzo per una settimana? cercando di far funzionare MS WebBrowser - tutto inutilmente. Non ho provato nessuno degli altri =: - {tranne EO.WebBrowser che ha funzionato per me la prima volta. Quindi i suoi 20 minuti con EO e il successo rispetto a 5 giorni con la SM e il completo e totale fallimento ignominio. Tutto quello che devo fare ora è trovare i $ 750 per acquistare il "successo" !!!
Richard Hammond,

0

Vale la pena dare un'occhiata a un prodotto commerciale come WebKitX qui: https://www.webkitx.com

inserisci qui la descrizione dell'immagine

Utilizza Chromium Embedded Framework e esegue il rendering di HTML5, WebGL, PDF e Flash su Windows XP, 7, 8, 10. Fornisce inoltre un controllo a 32 e 64 bit.

Offre l'accesso al DOM usando oggetti COM simili al controllo IE WebBrowser:

inserisci qui la descrizione dell'immagine

Puoi chiamare JavaScript in base al nome della funzione passando argomenti scalari (non usando eval) e ha anche callback JavaScript per Angular :

inserisci qui la descrizione dell'immagine

È possibile aggiungere i propri oggetti COM interoperabili a JavaScript:

inserisci qui la descrizione dell'immagine

Supporta WebGL / WebAudio per i giochi HTML5, che è possibile disabilitare per gli ambienti Citrix:

inserisci qui la descrizione dell'immagine


Lo uso in produzione e mi fido completamente. Ne ho provati molti altri e mi sono bloccato con questo browser. Gli sviluppatori sono davvero bravi e "personali". Non mi sentivo solo come con molti altri. Prodotto davvero buono e stabile.
potente

SO richiede dichiarazioni di non responsabilità, quindi sarebbe stato bello per Elias sottolineare che è il CTO di mobilefx, che sono i creatori di WebkitX
hko
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.