¿Reemplazar el control de .NET WebBrowser con un mejor navegador, como Chrome?

433

¿Hay alguna forma relativamente fácil de insertar un navegador moderno en una aplicación .NET?

Por lo que entiendo, el WebBrowsercontrol es un contenedor para IE , lo que no sería un problema, excepto que parece que es una versión muy antigua de IE , con todo lo que implica en términos de errores CSS, riesgos potenciales de seguridad (si el motor de renderizado no fue parcheado, ¿realmente puedo esperar que se solucionen los problemas de desbordamiento del búfer de zillion?), y otros problemas.

Estoy usando Visual Studio C # (edición express, ¿hace alguna diferencia aquí?)

Me gustaría integrar un buen navegador web en mis aplicaciones. En algunos, solo lo uso para manejar el proceso de registro de usuarios, interactuar con algunas de las características de mi sitio web y otras cosas de ese orden, pero tengo otra aplicación en mente que requerirá más err ... control.

Necesito:

  • Un navegador que puede integrarse dentro de una ventana de mi aplicación (no una ventana separada)
  • Un buen soporte para CSS, js y otras tecnologías web, a la par con cualquier navegador moderno
  • Funciones básicas del navegador como "navegar", "regresar", "recargar" ...
  • Acceso liberal al código de página y salida.

Estaba pensando en Chrome, ya que viene bajo la licencia BSD, pero estaría tan contento con una versión reciente de IE.

En la medida de lo posible, me gustaría mantener las cosas simples. Lo mejor sería si uno pudiera parchear el WebBrowsercontrol existente , que ya representa aproximadamente el 70% de lo que necesito, pero no creo que sea posible.

He encontrado un control activeX para Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm ) pero parece que es una versión antigua, por lo que no es necesariamente una mejora.

Estoy abierto a sugerencias

Sylverdrag
fuente
19
¿Por qué dice que el control WebBrowser usa una versión antigua de IE? Utiliza la versión instalada en el sistema del usuario, aunque el IE8 WebBrowser parece tener por defecto la representación de IE7: blogs.msdn.com/ie/archive/2009/03/10/…
Tim Robinson
17
Porque no se ve así en mi máquina. Tengo instalado IE8 pero el control muestra problemas de visualización que no he visto desde IE 5. Un formulario de inicio de sesión muy simple, 2 campos con un toque de CSS tiene una pantalla confusa, y algunas pantallas de JavaScript no funcionan, mientras que muestra bien en IE8, Firefox, Chrome, Opera ... así que asumí que el motor de renderizado era viejo. Podría estar completamente equivocado sobre eso y tal vez el problema sea de hecho diferente de lo que pensaba.
Sylverdrag
3
@Sylverdrag: Estás equivocado. Utiliza el último IE en su sistema. Sin embargo, leí en alguna parte que el control WebBrowser tiene un problema de compatibilidad con versiones anteriores más fuerte que el navegador independiente. IE8 puede tener, por ejemplo, un icono para hacer clic para activar el modo IE7. Como parte de su programa, esto no es posible, por lo que el control por defecto es el modo anterior para la compatibilidad. OTOH, no he leído cómo configurarlo para usar el "modo IE8".
John Saunders
55
En realidad, John Sanders, estás equivocado. Utiliza ie4 y necesita cambiar un valor de registro para indicarle que use current. Busque "emulación de modo de función" y obtendrá sus respuestas, modificadas recientemente, utilizadas para incluir palabras clave nativas pero lo cambiaron, busque en google las palabras clave que mencioné con "control de navegador web" y encontrará el artículo de msdn.
Erx_VB.NExT.Coder
8
Por defecto, un WebBrowsercontrol alojado usa la emulación IE7, a menos que se indique lo contrario con FEATURE_BROWSER_EMULATION. Esto se documenta aquí: blogs.msdn.com/b/askie/archive/2009/03/23/…
noseratio

Respuestas:

171

Pedido CefSharp .Net fijaciones, un proyecto que empecé hace un tiempo que por suerte fue recogida por la comunidad y se convirtió en algo maravilloso.

El proyecto envuelve el Chromium Embedded Framework y se ha utilizado en varios proyectos importantes, incluido el cliente de Windows de Rdio, Facebook Messenger para Windows y Github para Windows.

Cuenta con controles de navegador para WPF y Winforms y tiene toneladas de características y puntos de extensión. Al estar basado en el cromo, también es increíblemente rápido.

Agarrarlo de NuGet: Install-Package CefSharp.WpfoInstall-Package CefSharp.WinForms

Vea ejemplos y dé su opinión / comentarios / solicitudes de extracción: https://github.com/cefsharp/CefSharp

BSD con licencia

chillitom
fuente
2
Cambié a CEfSharp desde OWS, y puedo afirmar que es de una comunidad activa y de muy alta calidad. Quiéralo. github.com/cefsharp/CefSharp
Vin
1
CefSharp es excelente, pero tenga en cuenta que las bibliotecas son bastante grandes (20+ mb por última vez que busqué), por lo que podrían no ser adecuadas para un proyecto más liviano.
Skyl3lazer
1
@ANguyen sí puedes
chillitom
1
¡Muy, muy feliz de saber que eres tú quien inició este proyecto! Recientemente utilicé cefsharp, sin embargo, pude ver que el tamaño de la biblioteca es de más de 80 MB, que es enorme, pero necesario para el funcionamiento adecuado (especialmente la representación fluida) de la aplicación. ¿Hay alguna forma de reducir esto?
Aditya Bokade
55
Esto rompió mi proyecto. Todas las referencias se rompen después de instalar winforms nuget package.
toddmo
84

Chrome usa (un tenedor de) Webkit si no lo sabía, que también utiliza Safari. Aquí hay algunas preguntas que son de la misma línea:

El webkit uno no es genial como dice la otra respuesta, una versión ya no funciona (el código de google) y la Mono es experimental. Sería bueno que alguien hiciera el esfuerzo de hacer un contenedor .NET decente para él, pero no es algo que nadie quiera hacer, lo cual es sorprendente dado que ahora tiene soporte para HTML5 y tantas otras características que IE (8 ) falta motor.

Actualización (2014)

Hay un nuevo proyecto de doble licencia que le permite incrustar Chrome en sus aplicaciones .NET llamado Awesomium . Viene con una API .NET pero requiere bastantes hacks para renderizar (los ejemplos dibujan la ventana del navegador en un búfer, pintan el búfer como una imagen y se actualizan en un temporizador).

Creo que este es el navegador utilizado por Origin en Battlefield 3.

Actualización (2016)

Ahora existe DotnetBrowser , una alternativa comercial a Awesomium. Está basado en cromo.

Chris S
fuente
Gracias. Echaré un vistazo al envoltorio Gecko. Sin embargo, una cosa es que la respuesta original dice "Todo lo que necesita hacer es registrar el control ActiveX de Mozilla" y pensé que las ediciones Express no podían registrar controles adicionales. ¿Me estoy perdiendo algo obvio?
Sylverdrag el
44
@Syl las ediciones express pueden registrar tantos controles como sea necesario. Lo que no harán es permitirle instalar complementos en Visual Studio.
Joel Coehoorn el
1
He tenido experiencias bastante malas al usar WebKit con C # y finalmente tuve que conformarme con el componente predeterminado del navegador web que viene con .NET
Sumit Ghosh
1
A partir de esta fecha, los proyectos anteriores no son reemplazos viables. Errores del compilador en abundancia + inestabilidad. Awesomium, es completo y total basura.
Kraang Prime
"Creo que este es el navegador utilizado por Origin en Battlefield 3." Esto es incorrecto. Sé esto porque tuve que forzar a esta aplicación a usar, es decir, en Windows diez porque cuando no estaba en el borde, no funcionaba. Esto fue hace un tiempo, posiblemente un problema resuelto.
Theyouthis
64

He estado probando alternativas al componente del navegador web C # durante algunos días y aquí está mi lista:

1. Usando las nuevas versiones de IE 8,9:

¿El componente del navegador web es IE7 no IE8? ¿Cómo cambiar esto?

Pros:

  • No se requiere mucho trabajo para que funcione
  • cierto soporte HTML5 / CSS3 si IE9, completo si IE10

Contras:

  • La máquina de destino debe tener instalada la versión de IE de destino, IE10 todavía está en versión preliminar en Win7

Esto no requiere mucho trabajo y puede obtener compatibilidad con HTML5 y CSS3, aunque IE9 carece de algunas de las mejores características de CSS3 y HTML5. Pero estoy seguro de que podría ejecutar IE10 de la misma manera. El problema sería que el sistema de destino tendría que tener IE10 instalado, y como todavía está en versión preliminar en Windows 7, sugeriría que no lo haga.

2. OpenWebKitSharp

OpenWebKitSharp es un contenedor .net para el motor de webkit basado en el proyecto WebKit.NET 0.5. WebKit es un motor de diseño utilizado por Chrome / Safari

Pros:

  • Desarrollado activamente
  • Soporte HTML5 / CSS3

Contras:

  • Muchas características no implementadas
  • No es compatible con x64 (la aplicación debe estar construida para x86)

OpenWebKit es bastante agradable, aunque todavía no se han implementado muchas funciones, tuve algunos problemas al usarlo con Visual Studio, que arroja referencias de objetos nulos aquí y luego, en modo de diseño, hay algunos problemas js. Todos los que lo usen notarán casi inmediatamente que js alert no hace nada. Eventos como mouseup, mousedown ... etc. no funcionan, js arrastrar y soltar tiene errores, etc.

También tuve algunas dificultades para instalarlo, ya que requiere una versión específica de VC redistribuible instalada, así que después de la excepción, miré el registro de eventos, encontré la versión de VC y la instalé.

3. GeckoFX

Pros:

  • Funciona en mono
  • Desarrollado activamente
  • Soporte HTML5 / CSS3

Contras:

  • 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̶8̶6̶) ̶ - ver los comentarios a continuación

GeckoFX es un control de navegador web multiplataforma para incrustar en aplicaciones WinForms. Esto se puede usar con .NET en Windows y con mono en Linux. Gecko es un motor de diseño utilizado por Firefox.

Me encontré con poca información de que GeckoFX no está desarrollado activamente, lo cual no es cierto, por supuesto, siempre hay una o dos versiones detrás de Firefox, pero eso es normal, me impresionó mucho la actividad y el control en sí. Hace todo lo que necesitaba, pero necesitaba algo de tiempo para que funcione, aquí hay un pequeño tutorial para que funcione:

  1. Descargue GeckoFx-Windows-16.0-0.2 , aquí puede verificar si hay más nuevas disponibles GeckoFX
  2. Agregue referencias a dos dll descargados
  3. Dado que GeckoFX es un contenedor, necesita XulRunner, vaya a la Lista de versiones para ver cuál necesita
  4. Ahora que sabemos qué versión de XulRunner necesitamos, vamos a las versiones de Mozilla XulRunner , vamos a la carpeta de versión -> tiempos de ejecución -> xulrunner- (your_version) .en-US.win32.zip, en nuestro caso xulrunner-16.0.en- US.win32.zip
  5. Descomprima todo y copie todos los archivos en su bin \ Debug (o publique si su proyecto está configurado para lanzar)
  6. Vaya al diseñador de Visual Studio de su formulario, vaya a la caja de herramientas, haga clic con el botón derecho en el interior -> Elegir elementos -> Examinar -> Buscar el archivo dll descargado GeckoFX winforms -> Aceptar
  7. Ahora deberías tener un nuevo control GeckoWebBrowser

Si realmente debe usar Chrome, eche un vistazo a este producto llamado Awesomium , es gratis para proyectos no comerciales, pero la licencia es de unos pocos miles de dólares para comerciales.

formatoc
fuente
44
Muy buena descripción de cómo poner GeckoFx en funcionamiento. +1
Alex Essilfie
al construir Geckofx-Winforms necesitaba 4 bibliotecas gtk # (atk-sharp, gdk-sharp, glib-sharp y gtk-sharp), así que primero tuve que instalar Mono.
bernhardrusch
Esta respuesta es espectacular.
Mike Cole
Un gran análisis de hecho. Quería saber si probaste Awesomium con aplicaciones C #. ¿Tienes algo que decir al respecto? Todavía no lo he probado, pero me parece confiable después de mirar el panel de administradores que han mencionado en su página.
Abdul Rehman
2
@Wayne si quieres hacerlo bien, debes crear una carpeta en tu proyecto o un proyecto especial donde incluirías todos los archivos, gecko fx dlls y archivos xul runner y configurarlos para que se copien siempre, luego en cada acción de compilación que obtendrían copiado a su carpeta de compilación / depuración o publicado si publica desde VS, también hay Xpcom. Inicialice el método al que debe llamar y puede pasarlo ruta de archivos xul runner, espero que ayude
formatc
41

Tuve el mismo problema, el WebBrowser estaba usando una versión anterior de IE, con algunas búsquedas en Google encontré el siguiente código que hace un cambio en el registro y hace que el WebBrowser use la última versión de IE posible:

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

Solo necesita crear una clase y poner este código en ella, luego ejecutar el siguiente código cuando se inicie el programa:

 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

Puedes usarlo como:

If Not WBEmulator.IsBrowserEmulationSet() Then
    WBEmulator.SetBrowserEmulationVersion()
End If
Ashkan Mobayen Khiabani
fuente
1
¡¡Excelente!! Muchas gracias!
Ben
1
Traducido a Python (trabajando en una aplicación IronPython) y funcionó perfectamente. ¡Gracias!
David
1
Eso me salva la vida! Gracias
Neeraj Dubey
1
Esto es fantástico, pero ¿es posible restablecer la versión de emulación? Parece que la versión solo se puede configurar una vez en una aplicación WinForms. Si bien es posible que parezca que se restablece, el efecto es que, una vez configurado y restablecido en el registro, no se está volviendo a leer con nuevos valores de registro en una aplicación WinForms.
cymorg
1
@DarrenMB que yo sepa, usa IE11
Ashkan Mobayen Khiabani
27

Puede usar el registro para configurar la versión de IE para el control del navegador web. Vaya a: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION y agregue "yourApplicationName.exe" con el valor de browser_emulation. Para ver el valor de browser_emulation, consulte el enlace: http://msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation

golavietnam
fuente
10
Y si está depurando en Visual Studio, probablemente tendrá que usar "yourApplicationName.vshost.exe"
newenglander
3
Y si está depurando en Visual Studio, probablemente puede desmarcar "Habilitar el proceso de alojamiento de Visual Studio" en la pestaña Depurar de las propiedades de su proyecto. Entonces puede usar su nombre exe sin la parte "vshost".
Daniel Vygolov
1
@golavietnam ¿Puede ayudarme con esto? Probé sus instrucciones y utilicé las instrucciones en el enlace que proporcionó, pero aún no funciona. Cuando visito WhatIsMyBrowser.com usando el control de navegador web, me dice que estoy usando ie11 PERO en modo de compatibilidad ie 7 y muchos sitios web se niegan a trabajar y me dan un mensaje de "por favor actualice su navegador". ¿Cómo puedo forzar el control del navegador web para usar la última versión de ie que está instalada (ie11) de esta manera no funciona, lo he intentado cientos de veces.
jay_t55
Gracias, funcionó y me salvó el día
Tấn Nguyên
18

Observe el control Mono.WebBrowser : incorpora Gecko (como lo usa Firefox) o WebKit (como lo usa Safari) en WinForms (sin usar ActiveX).

RichieHindle
fuente
16

Sé que esto no es un control WebBrowser de 'reemplazo', pero estaba teniendo algunos problemas terribles de representación mientras mostraba una página que usaba BootStrap 3+ para el diseño, etc. y luego encontré una publicación que sugería que usara lo siguiente. Aparentemente es específico de IE y le dice que use la última variación encontrada en la máquina del cliente para renderizar (por lo que no usará IE7 como creo que es el predeterminado)

Así que solo pon:

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

en algún lugar de la parte principal de su documento.

Si, por supuesto, no es su documento, entonces esto obviamente no ayudará (aunque personalmente considero que es un agujero de seguridad si está leyendo páginas no creadas por usted a través del control de navegador web, ¡por qué no usar un navegador web!)

Buena suerte.

Codificador sin impresionar
fuente
Si quieres que esto funcione en un PC con Internet Explorer 7, no lo ponga en algún lugar en el <head>, lo puso como el primer hijo de <head>. Nos tomó un tiempo resolver esto.
Sylvain
Lo siento, quise decir IE8 no IE7 en mi comentario anterior. Entonces, en IE8, si no coloca el <meta>primer hijo de <head>, se ejecutará en modo de compatibilidad, no en modo de borde.
Sylvain
Estaba usando el complemento webbrowser en una aplicación winform y esto fue de gran ayuda. La página que estaba usando estaba usando jquery & angularjs que se estaba ahogando porque pensaba que el navegador era IE7 a pesar de que tenía instalado IE10.
Kywillis
Ese trabajo para mi! También puede usar esto para configurar una versión particular de IE, por ejemplo: <meta http-equiv = "X-UA-Compatible" content = "IE = 10" /> y siempre el navegador funciona como 10 (por supuesto, necesita haber instalado la misma versión o superior
freedeveloper
Esto es perfecto para mi caso de uso. Quiero mostrar mejores informes con formato html. Ya hay mucho contenido CSS disponible. Este es un mejor enfoque que incrustar Chrome / Firefox.
MD Luffy
13

Eche un vistazo a la biblioteca DotNetBrowser . Proporciona controles de navegador WPF y WinForms basados ​​en Chromium, que son bastante fáciles de integrar en la aplicación .NET. Es compatible con todos los estándares web modernos, incluidos HTML5, CSS3 y JavaScript. La página renderizada se ve exactamente como en Google Chrome.

La biblioteca hereda la arquitectura multiproceso de Chromium: cada página web se procesa en un proceso de Chromium separado y la aplicación continuará funcionando incluso después de que el complemento se bloquee o se produzca cualquier otro error inesperado en la página web.

Estas son algunas otras características útiles, proporcionadas por DotNetBrowser: es posible escuchar eventos de carga, manejar la actividad de la red, configurar proxy, simular acciones del usuario, trabajar con cookies, acceder y modificar DOM, escuchar eventos DOM, llamar a JavaScript desde .NET y viceversa, use la cámara web y el micrófono en la página web, configure la comunicación basada en WebRTC y más .

Consulte la Referencia de API para más detalles.

El fragmento de código a continuación muestra cómo crear un BrowserView, incrustarlo en un formulario y cargar una 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 vez que ejecute el ejemplo anterior, obtendrá el siguiente resultado:

ingrese la descripción de la imagen aquí

La biblioteca es comercial. Las licencias comerciales incluyen paquetes de soporte para diferentes tamaños de equipo. También es posible comprar el código fuente de la biblioteca.

Además de su propia página, el componente está disponible como paquete NuGet y como paquete VSIX en Visual Studio Marketplace.

Vladimir
fuente
16
Cuidado con el alto precio de este producto
jjxtra
3
No es de código abierto, su licencia no es más barata.
Ashish-BeJovial
8

He probado un puñado de variantes de Webkit, pero en mi experiencia nada supera los avances que tiene OpenWebkitSharp . Me encanta, me encanta ... Las puntuaciones de HTML5 y CSS3 son lo más cercanas que pueden llegar a Google Chrome. Muy buena API y modelo de eventos. Si encuentra API "no implementadas" muy probablemente porque no están implementadas en Webkit. Todo lo demás funciona muy bien.

OpenWebKitSharp es un contenedor .net para el motor de webkit basado en el proyecto WebKit.NET 0.5. Agrega más funcionalidad a la versión 0.5 y proporciona más métodos que esa compilación. OpenWebKitSharp admite tanto la compilación Cairo (0.5) como las compilaciones nocturnas de webkit (Nightly por defecto). En la Versión 1.5 Estable y más, la compilación nocturna se incluye y se copia automáticamente después de la compilación. En versiones anteriores esto sucede con la construcción de El Cairo. OpenWebKitSharp actualmente impulsa GTLite Navigator, un navegador web rápido, estable y flexible.

Vin
fuente
1
Gracias. ¡Eso parece un gran descubrimiento!
Sylverdrag
Sus foros también son bastante activos, y obtuve respuestas muy rápidas a mis preguntas. Ahora estoy usando esto para todas mis necesidades de control de navegador web
Vin
2
Sí, hace todo eso, llamas a ExecuteScript. Sin embargo, cambié a CefSharp y puedo decirte que me gusta mucho más que OWS
Vin
1
Otro repugnante desorden de código que no es viable para su uso.
Kraang Prime
1
cuidado con webkit no puedo usar proxy, tengo problemas con esto
skhurams
7

ACTUALIZACIÓN 2018 MAYO

Si está apuntando a que la aplicación se ejecute en Windows 10, ahora puede incrustar el navegador Edge en su aplicación .net utilizando Windows Community Toolkit .

Ejemplo de WPF:

1) Instale el paquete Nuget de Windows Community Toolkit

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

2) Código 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) Código 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"));
  }
}

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

Por favor, consulte este enlace para más información.

Rahul
fuente
Instalé el paquete Nuget, pero no funciona. Todavía ty.
Deniz
6

Prueba EO.WebBrowser . Es nuevo y se basa en la última versión del navegador Chrome. La mejor parte es que empaqueta todo dentro de un solo .NET dll, por lo que no solo es muy fácil de usar e implementar, sino que también la misma DLL admite 32 bits y 64 bits porque es un .NET dll.

usuario2540812
fuente
99
En el futuro, indique que este es un producto con licencia comercial, y si tiene alguna afiliación con el producto, consulte Evite la autopromoción abierta en las Preguntas frecuentes.
Andy Brown
1
Después de buscar durante años como un sombrerero loco ---- este control "comercial" es, literalmente, el ÚNICO reemplazo de IE para trabajar con el que no tuve que molestarme y no estropeé ninguno de mis navegadores actuales ajustes - si estoy marcando, NO estoy asociado con EO de ninguna forma o forma. Estoy ENOJADO de que todas estas otras soluciones sean completamente basura y un desperdicio completo de todos los tiempos.
Kraang Prime
@SanuelJackson GeckoFx funciona perfectamente en mi empresa y no ha causado ningún problema con la configuración del navegador
Wayne
@Wayne: eso es bueno para ti. Ninguno de estos proyectos abiertos es un reemplazo directo que requiere una modificación significativa para funcionar como código administrado, especialmente como un control de formularios win. Carecen de la funcionalidad que ofrece el control de IE y / o están completas, ya que se bloquean constantemente o son lentas, ni siquiera pueden enumerar todos los problemas aquí. Tal vez en otra década, cuando Internet ya no requiera navegadores web, tal vez entonces algo viable esté funcionando.
Kraang Prime
@SanuelJackson Hmm, desearía que lo que dijiste fuera cierto. Lamentablemente, ninguna de las alternativas (incluida GeckoFX) no tenía ningún error para detener el espectáculo. También desearía haber evitado el alto precio del navegador Essential Objects. Pero fue el único que funcionó perfectamente para mí.
Maiken Roskilde
5

He usado GeckoFX y me sirve muy bien. Utiliza el motor Firefox. La única advertencia con la que me he encontrado es que emite el evento "DocumentLoaded" una vez antes de que el documento esté completamente cargado ... Creo que dispara uno cuando se carga el HTML y luego otro cuando todo el Se cargan imágenes y cosas. Lo arreglé simplemente ignorando el primero, y hasta ahora ha funcionado maravillosamente sin fallas.

Puede encontrarlo aquí: https://bitbucket.org/geckofx/

Como la mayoría de las bibliotecas decentes, es de código abierto.

Teekin
fuente
2
Todos los componentes basados ​​en Firefox que funcionan, atornillan con la instalación de los usuarios de Firefox. Afortunadamente, la mayoría de estas soluciones no funcionan en absoluto, y si tiene suerte, mantiene su configuración de Firefox intacta --- no es tan afortunada, pierde todas sus configuraciones y aún no tiene nada mejor que IE como complemento.
Kraang Prime
1
Link está muerto y es de construcción antigua. bitbucket.org/geckofx tiene la versión actual
Wayne
@Sanual Jackson: utilicé GeckoFx durante años y nunca tuve problemas con la instalación de Firefox por parte del usuario, incluido el mío. ¿Estás adivinando?
PandaWood
3

MozNet es un control .NET, anteriormente basado en el control GeckoFX más o menos abandonado, pero está en pleno desarrollo y tiene muchas más funciones de las que GeckoFX puede sacudir un palo. Puede encontrarlo en el sitio web de Se7en Soft .

usuario257033
fuente
1
GeckoFX se está desarrollando activamente en: bitbucket
Wayne
2

Actualización 2016:

Hay 3 opciones adicionales que puedo sugerir:

1. BrowseEmAll.Cef

Un componente .Net que se puede utilizar para integrar el motor Chrome en su aplicación .Net. Basado en CefGlue pero un poco más rápido en las actualizaciones de la última versión de Chrome. También hay una opción de soporte comercial disponible que puede ser útil para algunos. Por supuesto, el componente en sí es de código abierto .

2. BrowseEmAll.Gecko

Otro componente .Net que se puede utilizar para integrar el motor Firefox en su aplicación .Net. Esto se basa en Geckofx, pero a diferencia de la versión actual de Geckofx, funcionará con una versión de lanzamiento normal de Firefox. Para usar Geckofx, deberá construir Firefox usted mismo. Una vez más, el soporte comercial está disponible, pero el componente en sí es completamente de código abierto .

3. BrowseEmAll Core API

¿Necesita todos los navegadores diferentes en su aplicación .Net? En la API principal de BrowseEmAll puede integrar Chrome, Firefox, Webkit e Internet Explorer en su aplicación. Este es un producto comercial, así que ten cuidado.

(Divulgación completa: trabajo para esta empresa, así que tome todo lo que digo con un grano de sal)

daniel.herken
fuente
1

Si está buscando un buen control basado en IE, consulte: http://code.google.com/p/csexwb2/

Lo he usado en productos de producción. Es bastante bueno y tiene buenas demostraciones, aunque parece que ahora no se mantiene tan bien como solía hacerlo.

scotru
fuente
1

Geckofx y Webkit.net fueron prometedores al principio, pero no se mantuvieron actualizados con Firefox y Chrome respectivamente, mientras que a medida que Internet Explorer mejoró, también lo hizo el control Webbrowser, aunque se comporta como IE7 por defecto, independientemente de la versión de IE que tenga tienen pero eso se puede solucionar yendo al registro y cambiándolo a IE9 permitiendo HTML5.

usuario2319683
fuente
0

He probado todos los navegadores que están ahí fuera. Lamentablemente, el único que realmente funcionó para mí en todas las circunstancias fue EO.Browser. Desearía haber elegido una solución gratuita, pero terminé con EO.Browser. Es bastante caro, pero está bien mantenido.

AntonioC
fuente
0

Actualización 2016:

Para mí, la única alternativa de navegador confiable y mantenida a IE es EO.WebBrowser. Pasé días y semanas probando a los demás. Todos ellos tuvieron algunos problemas que me detuvieron en algún momento.

AntonioC
fuente
1
Bueno ... ¿Estuve dando vueltas por una semana? tratando de hacer que MS WebBrowser funcione, todo fue en vano. No probé ninguno de los otros =: - {excepto EO.WebBrowser que funcionó para mí la primera vez. Por lo tanto, son 20 minutos con EO y éxito versus 5 días con EM y falla ignominiosa completa y absoluta. ¡Todo lo que tengo que hacer ahora es encontrar los $ 750 para comprar 'éxito'!
Richard Hammond el
0

Vale la pena echarle un vistazo a un producto comercial como WebKitX aquí: https://www.webkitx.com

ingrese la descripción de la imagen aquí

Utiliza Chromium Embedded Framework y renderiza HTML5, WebGL, PDF y Flash en Windows XP, 7, 8, 10. También proporciona sabores de control de 32 bits y de 64 bits.

Ofrece acceso DOM utilizando objetos COM similares al control IE WebBrowser:

ingrese la descripción de la imagen aquí

Puede llamar a JavaScript por el nombre de la función pasando argumentos escalares (sin usar eval) y también tiene devoluciones de llamada de JavaScript para Angular :

ingrese la descripción de la imagen aquí

Puede agregar sus propios objetos COM interoperables a JavaScript:

ingrese la descripción de la imagen aquí

Es compatible con WebGL / WebAudio para juegos HTML5, que puede deshabilitar para entornos Citrix:

ingrese la descripción de la imagen aquí

Elias
fuente
Lo uso en producción y confío plenamente en él. He probado muchos otros, y me quedé atascado con este navegador. Los desarrolladores son realmente buenos y "personales". No me sentí solo como con muchos otros. Producto realmente bueno y estable.
tmighty
SO requiere descargos de responsabilidad, por lo que hubiera sido bueno para Elias señalar que él es el CTO de mobilefx, que son los creadores de WebkitX
hko