Substituindo o controle .NET WebBrowser por um navegador melhor, como o Chrome?

433

Existe alguma maneira relativamente fácil de inserir um navegador moderno em um aplicativo .NET?

Pelo que entendi, o WebBrowsercontrole é um invólucro para o IE , o que não seria um problema, exceto pelo fato de parecer uma versão muito antiga do IE , com tudo o que isso implica em termos de erros de CSS, riscos potenciais à segurança (se o mecanismo de renderização não tiver sido corrigido, posso realmente esperar que os zilhões de problemas de estouro de buffer sejam corrigidos?) e outros problemas.

Estou usando o Visual Studio C # (edição expressa - isso faz alguma diferença aqui?)

Gostaria de integrar um bom navegador da web em meus aplicativos. Em alguns, eu apenas o uso para lidar com o processo de registro do usuário, interface com alguns dos recursos do meu site e outras coisas dessa ordem, mas tenho outro aplicativo em mente que exigirá mais controle ...

Eu preciso:

  • Um navegador que pode integrar-se dentro de uma janela do meu aplicativo (não uma janela separada)
  • Um bom suporte para CSS, js e outras tecnologias da Web, a par de qualquer navegador moderno
  • Funções básicas do navegador como "navegar", "voltar", "recarregar" ...
  • Acesso liberal ao código da página e saída.

Eu estava pensando no Chrome, já que ele vem sob a licença BSD, mas ficaria feliz com uma versão recente do IE.

Tanto quanto possível, gostaria de manter as coisas simples. O melhor seria se alguém pudesse corrigir o WebBrowsercontrole existente , que já representa cerca de 70% do que eu preciso, mas não acho que isso seja possível.

Eu encontrei um controle activeX para o Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm ), mas parece que é uma versão antiga, portanto não é necessariamente uma melhoria.

Estou aberto a sugestões

Sylverdrag
fonte
19
Por que você diz que o controle WebBrowser usa uma versão antiga do IE? Ele usa a versão instalada no sistema do usuário, embora o IE8 WebBrowser pareça padronizar a renderização do IE7: blogs.msdn.com/ie/archive/2009/03/10/…
Tim Robinson
17
Porque não parece assim na minha máquina. Eu tenho o IE8 instalado, mas o controle mostra problemas de exibição que não vejo desde o IE 5. Um formulário de login muito simples, 2 campos com um toque de CSS tem uma exibição ilegível e alguma exibição em javascript não funciona, enquanto exibe bem no IE8, Firefox, Chrome, Opera ... então eu assumi que o mecanismo de renderização era antigo. Eu poderia estar completamente errado sobre isso e talvez o problema seja de fato diferente do que eu pensava.
Sylverdrag
3
@Sylverdrag: Você está errado. Ele usa o IE mais recente no seu sistema. No entanto, li em algum lugar que o controle WebBrowser tem um problema de compatibilidade com versões anteriores mais forte que o navegador autônomo. O IE8 pode ter, por exemplo, um ícone no qual clicar para ativar o modo IE7. Como parte do seu programa, isso não é possível; portanto, o controle é padronizado no modo anterior para compatibilidade. OTOH, não li como configurá-lo para usar o "modo IE8".
John Saunders
55
Na verdade, John Sanders, você está errado. Ele usa o ie4 e você precisa alterar um valor do registro para informar o uso atual. Procure "emulação de modo de recurso" e você obterá as respostas, alteradas recentemente, usadas para incluir palavras-chave nativas, mas elas foram alteradas.
Erx_VB.NExT.Coder
8
Por padrão, um WebBrowsercontrole hospedado usa emulação IE7, a menos que instruído de outra forma FEATURE_BROWSER_EMULATION. Isto está documentado aqui: blogs.msdn.com/b/askie/archive/2009/03/23/…
noseratio

Respostas:

171

Caixa CefSharp .Net ligações, um projeto que começou há um tempo atrás que, felizmente, foi pego pela comunidade e transformado em algo maravilhoso.

O projeto envolve o Chromium Embedded Framework e foi usado em vários projetos importantes, incluindo o cliente Windows da Rdio, o Facebook Messenger para Windows e o Github para Windows.

Possui controles de navegador para WPF e Winforms e possui vários recursos e pontos de extensão. Sendo baseado no Chromium, é incrivelmente rápido também.

Pegue no NuGet: Install-Package CefSharp.WpfouInstall-Package CefSharp.WinForms

Confira exemplos e dê seus pensamentos / feedback / solicitações de recebimento: https://github.com/cefsharp/CefSharp

Licenciado BSD

chillitom
fonte
2
Eu mudei para o CEfSharp da OWS e posso afirmar assertivamente que é de alta qualidade e com uma comunidade ativa. Adoro. github.com/cefsharp/CefSharp
Vin
1
O CefSharp é ótimo, mas esteja ciente de que as bibliotecas são grandes com falha (mais de 20 mb da última vez que olhei), portanto elas podem não ser adequadas para um projeto mais leve.
precisa saber é o seguinte
1
@ANguyen yes you can
chillitom
1
Muito, muito feliz em saber que é você quem iniciou este projeto! Recentemente, usei o cefsharp, no entanto, pude ver que o tamanho da biblioteca é de mais de 80 MB, o que é enorme, mas necessário para o funcionamento adequado (renderização especialmente suave) do aplicativo. Existe alguma maneira de reduzir isso?
Aditya Bokade
5
Isso quebrou meu projeto. Todas as referências foram quebradas após a instalação do pacote winforms nuget.
toddmo
84

O Chrome usa (um garfo do) Webkit, se você não sabia, que também é usado pelo Safari. Aqui estão algumas perguntas da mesma linha:

O webkit não é ótimo como a outra resposta afirma, uma versão não funciona mais (a do Google Code) e a Mono é experimental. Seria bom se alguém fizesse um esforço para criar um invólucro .NET decente para ele, mas não é algo que alguém queira fazer - o que é surpreendente, já que agora ele suporta HTML5 e muitos outros recursos que o IE (8). ) falta de motor.

Atualização (2014)

Há um novo projeto de licença dupla que permite incorporar o Chrome nos aplicativos .NET chamados Awesomium . Ele é fornecido com uma API .NET, mas requer alguns hacks para renderização (os exemplos atraem a janela do navegador para um buffer, pintam o buffer como uma imagem e são atualizados em um timer).

Acho que esse é o navegador usado pelo Origin no Battlefield 3.

Atualização (2016)

Agora existe o DotnetBrowser , uma alternativa comercial ao Awesomium. É baseado no Chromium.

Chris S
fonte
Obrigado. Vou dar uma olhada no invólucro Gecko. Porém, a resposta original diz "Tudo o que você precisa fazer é registrar o controle Mozilla ActiveX" e pensei que as edições Express não pudessem registrar controles adicionais. Estou perdendo algo óbvio?
Sylverdrag
4
@Syl as edições expressas podem registrar quantos controles forem necessários. O que eles não farão é permitir que você instale plugins no visual studio.
Joel Coehoorn
1
Eu tive experiências muito ruins de utilizar WebKit com C # e, finalmente, eu tinha que resolver sobre o componente de navegador web padrão que vem com .NET
Sumit Ghosh
1
Até essa data, os projetos acima não são substitutos viáveis ​​do drop-in. Erros do compilador em abundância + instabilidade. Awesomium, é lixo completo e absoluto.
Kraang Prime
"Acho que este é o navegador usado pelo Origin no Battlefield 3." Isto está incorreto. Eu sei disso porque eu tive que forçar este aplicativo a usar, ou seja, no Windows 10, porque quando o padrão era o limite, ele não funcionava. Isso foi há um tempo atrás, possivelmente um problema resolvido.
Theyouthis 02/02
64

Estou testando alternativas para o componente de navegador da Web C # há alguns dias e aqui está minha lista:

1. Usando as versões mais recentes do IE 8,9:

O componente Navegador da Web não é o IE7, mas o IE8? Como mudar isso?

Prós:

  • Não é necessário muito trabalho para executá-lo
  • algum suporte a HTML5 / CSS3 se IE9, completo se IE10

Contras:

  • A máquina de destino deve ter a versão de destino do IE instalada, o IE10 ainda está em visualização no Win7

Isso não requer muito trabalho e você pode obter suporte para HTML5 e CSS3, embora o IE9 não possua alguns dos melhores recursos de CSS3 e HTML5. Mas tenho certeza de que você poderia fazer o IE10 funcionar da mesma maneira. O problema seria que o sistema de destino teria que ter o IE10 instalado e, como ainda está em pré-visualização no Windows 7, sugiro que não.

2. OpenWebKitSharp

O OpenWebKitSharp é um wrapper .net para o mecanismo do webkit baseado no projeto WebKit.NET 0.5. O WebKit é um mecanismo de layout usado pelo Chrome / Safari

Prós:

  • Desenvolvido ativamente
  • Suporte HTML5 / CSS3

Contras:

  • Muitos recursos não implementados
  • Não suporta x64 (o aplicativo deve ser criado para x86)

O OpenWebKit é bastante bom, embora muitos recursos ainda não tenham sido implementados, tive alguns problemas ao usá-lo com o visual studio, que lança referência de objeto nulo aqui e, em seguida, no modo de design, existem alguns problemas de JS. Qualquer pessoa que o utilize quase imediatamente notará que o js alert não faz nada. Eventos como mouseup, mousedown ... etc. não funcionam, js arrastar e soltar é de buggy e assim por diante ..

Eu também tive algumas dificuldades em instalá-lo, pois ele requer uma versão específica do VC redistribuível instalada; portanto, após a exceção, observei o log de eventos, encontrei a versão do VC e a instalei.

3. GeckoFX

Prós:

  • Funciona em mono
  • Desenvolvido ativamente
  • Suporte 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̶) - comments

GeckoFX é um controle Webrowser multiplataforma para incorporação em aplicativos WinForms. Isso pode ser usado com o .NET no Windows e com o mono no Linux. Gecko é um mecanismo de layout usado pelo Firefox.

Encontrei poucas informações de que o GeckoFX não é desenvolvido ativamente, o que não é verdade, é claro que sempre há uma ou duas versões do Firefox, mas isso é normal, fiquei realmente impressionado com a atividade e o próprio controle. Ele faz tudo o que eu precisava, mas precisei de algum tempo para executá-lo. Aqui está um pequeno tutorial para executá-lo:

  1. Faça o download do GeckoFx-Windows-16.0-0.2 , aqui você pode verificar se está disponível um novo GeckoFX
  2. Adicione referências a duas dlls baixadas
  3. Como o GeckoFX é um invólucro, você precisa do XulRunner, vá para a Lista de versões para ver qual deles precisa
  4. Agora que sabemos qual versão do XulRunner precisamos, vamos para os lançamentos do Mozilla XulRunner , para a pasta version -> runtimes -> xulrunner- (your_version) .en-US.win32.zip, no nosso caso xulrunner-16.0.en- US.win32.zip
  5. Descompacte tudo e copie todos os arquivos para sua lixeira \ Debug (ou libere se seu projeto estiver definido para ser lançado)
  6. Vá para o visual studio designer do seu formulário, vá para a caixa de ferramentas, clique com o botão direito do mouse dentro -> Escolha itens -> Navegar -> Encontre o arquivo dll do GeckoFX winforms dll baixado -> OK
  7. Agora você deve ter um novo controle GeckoWebBrowser

Se você realmente precisa usar o Chrome, dê uma olhada neste produto chamado Awesomium , ele é gratuito para projetos não comerciais, mas a licença custa alguns milhares de dólares para fins comerciais.

formatc
fonte
4
Muito boa descrição de como colocar o GeckoFx em funcionamento. +1
Alex Essilfie
ao criar o Geckofx-Winforms, eu precisava de 4 bibliotecas gtk # (atk-sharp, gdk-sharp, glib-sharp e gtk-sharp), então tive que instalar o Mono primeiro.
bernhardrusch
Essa resposta é espetacular.
Mike Cole
Uma ótima análise de fato. Eu queria saber se você testou o Awesomium com aplicativos C #. Você tem alguma opinião sobre isso? Ainda não testei, mas me parece confiável depois de examinar o painel de curadores que eles mencionaram em sua página.
Abdul Rehman
2
@Wayne, se você quiser fazer o certo, deve criar uma pasta em seu projeto ou um projeto específico em que inclua todos os arquivos, dlls do gecko fx e arquivos do xul runner e defina-os para copiar sempre, em todas as ações de compilação que receberiam copiados para a pasta build / debug ou publicados, se você publicar a partir de VS, também há método Xpcom.Initialize que você deve chamar e você pode passá-lo XUL caminho de arquivos de corredor, espero que ajude
formatc
41

Eu tive o mesmo problema, o WebBrowser estava usando uma versão antiga do IE, com algumas pesquisas, encontrei o código a seguir que faz uma alteração no registro e faz o WebBrowser usar a versão mais recente possível do IE:

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

Você só precisa criar uma classe e inserir esse código e, em seguida, execute o seguinte código quando o programa iniciar:

 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

Você pode usá-lo como:

If Not WBEmulator.IsBrowserEmulationSet() Then
    WBEmulator.SetBrowserEmulationVersion()
End If
Ashkan Mobayen Khiabani
fonte
1
Excelente!! Muito obrigado!
Ben
1
Traduzido para Python (trabalhando em um aplicativo IronPython) e funcionou perfeitamente. Obrigado!
David
1
Isso salva minha vida! Graças
Neeraj Dubey
1
Isso é fantástico, mas é possível redefinir a versão de emulação? Parece que a versão só pode ser definida uma vez em um aplicativo WinForms. Embora seja possível fazer com que pareça redefinir, o efeito é que, uma vez definido e redefinido no registro, ele não está sendo relido com novos valores de registro em um aplicativo WinForms.
Cymorg 24/04/19
1
@DarrenMB, tanto quanto eu sei que usa IE11
Ashkan Mobayen Khiabani
27

Você pode usar o registro para definir a versão do IE para o controle do navegador da web. Vá para: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION e adicione "yourApplicationName.exe" com o valor de browser_emulation Para ver o valor da browser_emulation, consulte o link: http://msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation

golavietnam
fonte
10
E se você estiver depurando no visual studio, provavelmente precisará usar "yourApplicationName.vshost.exe"
newenglander
3
E se você estiver depurando no visual studio, provavelmente poderá desmarcar "Habilitar o processo de hospedagem do Visual Studio" na guia Debug das propriedades do seu projeto. Então você pode usar o nome do seu exe sem a parte "vshost".
Daniel Vygolov
1
@golavietnam Você pode me ajudar com isso? Tentei suas instruções e usei as instruções no link que você forneceu, mas ainda não funciona. Quando visito o WhatIsMyBrowser.com usando o controle de navegador da Web , ele diz que estou usando o ie11 MAS no modo de compatibilidade 7 , e muitos sites se recusam a trabalhar e me enviam a mensagem "atualize seu navegador". Como forçar o controle do navegador da web a usar a versão mais recente do ie que está instalada (ie11) dessa maneira não funciona, eu tentei centenas de vezes.
Jay_t55
Obrigado, funcionou e salvou o meu dia
Tấn Nguyên 17/04
18

Ter olhar para o Mono.WebBrowser controle - ele incorpora tanto Gecko (como o usado pelo Firefox) ou WebKit (como o usado pelo Safari) em WinForms (sem o uso de ActiveX).

RichieHindle
fonte
16

Sei que este não é um controle WebBrowser 'substituto', mas estava tendo alguns problemas de renderização horríveis enquanto mostrava uma página que estava usando o BootStrap 3+ para layout, etc. Aparentemente, é específico para o IE e diz para ele usar a variação mais recente encontrada na máquina cliente para renderização (para que não use o IE7 como eu acredito que seja o padrão)

Então, basta colocar:

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

em algum lugar na parte principal do seu documento.

Se é claro que não é o seu documento, isso obviamente não ajudará (embora eu pessoalmente considere isso uma brecha de segurança se você estiver lendo páginas não criadas por você mesmo através do controle do navegador da web - por que não usar apenas um navegador da web!)

Boa sorte.

UnimpressedCoder
fonte
Se você deseja que isso funcione em um PC executando o IE7, não o coloque em algum lugar<head> , coloque-o como o primeiro filho de <head>. Demorou um pouco para descobrir isso.
Sylvain
Desculpe, eu quis dizer IE8 não IE7 no meu comentário anterior. Portanto, no IE8, se você não colocar o <meta>primeiro filho <head>, ele será executado no modo de compatibilidade, não no modo de borda.
Sylvain
Eu estava usando o plug-in do navegador da web em um aplicativo winform e isso foi uma grande ajuda. A página que eu estava acessando estava usando jquery & angularjs, o que estava sufocando, porque pensava que o navegador era o IE7, apesar de eu ter o IE10 instalado.
22714 Kywillis
Isso funciona para mim! Você também pode usar isso para definir uma versão específica do IE, por exemplo: <meta http-equiv = "Compatível com X-UA" content = "IE = 10" /> e sempre o navegador funciona como 10 (é claro que você precisa ter instalado a mesma versão ou superior
freedeveloper
Isto é perfeito para o meu caso. Quero mostrar relatórios formatados em html. Já existe muito conteúdo CSS disponível por aí. Essa é uma abordagem melhor do que incorporar chrome / firefox.
Luffy MD
13

Dê uma olhada na biblioteca DotNetBrowser . Ele fornece controles de navegador WPF e WinForms baseados em Chromium, fáceis de incorporar ao aplicativo .NET. Ele suporta todos os padrões modernos da web, incluindo HTML5, CSS3 e JavaScript. A página renderizada é exatamente igual ao Google Chrome.

A biblioteca herda a arquitetura de processos múltiplos do Chromium - cada página da web é renderizada em um processo separado do Chromium, e o aplicativo continua funcionando mesmo após a falha do plug-in ou qualquer outro erro inesperado na página da web.

Aqui estão alguns outros recursos úteis, fornecidos pelo DotNetBrowser: é possível ouvir eventos de carregamento, gerenciar atividades de rede, configurar proxy, simular ações do usuário, trabalhar com cookies, acessar e modificar DOM, ouvir eventos DOM, ouvir eventos DOM, chamar JavaScript do .NET e vice-versa, use câmera e microfone na página da Web, configure a comunicação baseada no WebRTC e muito mais .

Confira a Referência da API para obter mais detalhes.

O trecho de código abaixo demonstra como criar um BrowserView, incorporá-lo em um formulário e carregar um 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");
        }
    }
}

Depois de executar o exemplo acima, você obterá a seguinte saída:

insira a descrição da imagem aqui

A biblioteca é comercial. As licenças comerciais incluem pacotes de suporte para diferentes tamanhos de equipe. Também é possível comprar o código fonte da biblioteca.

Além de sua própria página do componente está disponível como pacote NuGet e como pacote VSIX no Visual Studio de mercado.

Vladimir
fonte
16
Cuidado com o elevado preço deste produto
jjxtra
3
Não é de código aberto, sua licença não é mais barata.
Ashish-BeJovial 22/02/19
8

Eu tentei várias variantes do Webkit, mas na minha experiência nada supera os avanços que o OpenWebkitSharp possui. Adore, adore .. As pontuações HTML5 e CSS3 são as mais próximas possíveis do Google Chrome. API e modelo de eventos muito bons. Se você encontrar APIs "não implementadas", provavelmente porque elas não foram implementadas no Webkit. Tudo o resto funciona muito bem.

O OpenWebKitSharp é um wrapper .net para o mecanismo de kit da web baseado no projeto WebKit.NET 0.5. Ele adiciona mais funcionalidade à versão 0.5 e fornece mais métodos que essa compilação. O OpenWebKitSharp suporta a compilação do Cairo (0.5) e a noturna do webkit (Nightly por padrão). Na versão 1.5 Estável e mais, a compilação noturna é incluída e copiada automaticamente após a compilação. Nas versões anteriores, isso acontece com o cairo build. Atualmente, o OpenWebKitSharp oferece suporte ao GTLite Navigator, um navegador da Web rápido, estável e flexível.

Vin
fonte
1
Obrigado. Parece uma ótima descoberta!
Sylverdrag
Seus fóruns também são bastante ativos, e eu recebi respostas muito rápidas para minhas perguntas. Agora eu estou usando isso para todas as minhas necessidades Controlare
Vin
2
Sim, faz tudo isso, você chama ExecuteScript. No entanto eu mudei para CefSharp e posso dizer-lhe eu gosto muito melhor do que OWS
Vin
1
Outra bagunça nojenta de código que não é viável para usar o que for.
Kraang Prime
1
cuidado -webkit não podem utilizar im de proxy que tem o problema com esta
skhurams
7

ATUALIZAÇÃO 2018 DE MAIO

Se você está direcionando o aplicativo para execução no Windows 10, agora pode incorporar o navegador Edge no aplicativo .net usando o Windows Community Toolkit .

Exemplo WPF:

1) Instale o pacote Nuget do 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"));
  }
}

Exemplo 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 link para mais informações.

Rahul
fonte
Eu instalei o pacote Nuget, mas ele não está funcionando. Ainda ty.
Deniz
6

Experimente o EO.WebBrowser . É novo e baseia-se na versão mais recente do navegador Chrome. A melhor parte disso é que ele compacta tudo dentro de uma única DLL do .NET, além de ser muito fácil de usar e implantar, mas também a mesma DLL suporta 32 bits e 64 bits porque é uma DLL do .NET.

user2540812
fonte
9
No futuro, declare que este é um produto licenciado comercialmente e se você tem ou não alguma afiliação com o produto, consulte Evitar a autopromoção aberta nas Perguntas frequentes.
Andy Brown
1
Depois de procurar como um louco por ANOS ---- esse controle "comercial" é literalmente o ÚNICO substituto substituto para o IE com o qual eu não precisei mexer e não estraguei nenhum dos meus navegadores atuais definições. - se sinalizando, NÃO estou associado ao EO de nenhuma forma ou forma. Fico puto de que todas essas outras soluções sejam completamente lixo e um desperdício completo do tempo de todos.
Kraang Prime
@SanuelJackson GeckoFx está funcionando perfeitamente na minha empresa e não causou quaisquer problemas com as configurações do navegador
Wayne
@ Wayne - isso é bom para você. Nenhum desses projetos abertos é um substituto de drop-in que exige modificações significativas para funcionar como código gerenciado, especialmente como um controle de winforms de drop-in. Eles não têm a funcionalidade que o controle IE oferece e / ou são completos, pois travam constantemente ou são lentos - não podem nem listar todos os problemas aqui. Talvez em outra década em que a internet não exija mais navegadores da web, talvez algo viável esteja em condições de funcionamento.
Kraang Prime
@SanuelJackson Hmm, gostaria que o que você dissesse fosse verdade. Infelizmente, nenhuma das alternativas (incluindo GeckoFX) não teve nenhum erro de parada de exibição para mim. Eu também gostaria de ter evitado o alto preço do navegador Essential Objects. Mas foi o único que funcionou perfeitamente para mim.
Maiken Roskilde
5

Eu usei o GeckoFX e isso me serve muito bem. Ele usa o mecanismo do Firefox. A única ressalva em que eu já me deparei com isso é que ele emite o evento "DocumentLoaded" uma vez antes de o documento estar totalmente carregado ... Acho que dispara um quando o HTML é carregado e outro quando todo o imagens e outras coisas são carregadas. Corrigi-o simplesmente ignorando o primeiro, e funcionou lindamente sem falhas até agora.

Você pode encontrá-lo aqui: https://bitbucket.org/geckofx/

Como a maioria das bibliotecas decentes, é de código aberto.

Teekin
fonte
2
Todos os componentes baseados em firefox que funcionam, estragam a instalação do Firefox pelos usuários. Felizmente, a maioria dessas soluções não funciona e, se tiver sorte, mantém as configurações do Firefox intactas - não tem tanta sorte, você perde todas as configurações e ainda não tem nada melhor do que o IE como drop-in.
Kraang Prime
1
Link está morto e de construção antiga. bitbucket.org/geckofx tem a versão atual
Wayne
@ Sanual Jackson - usei o GeckoFx por anos e nunca tive problemas com a instalação do Firefox pelo usuário - incluindo a minha. Você está apenas adivinhando?
PandaWood 27/10/2015
3

MozNet é um controle .NET, anteriormente baseado no controle GeckoFX mais ou menos abandonado, mas está em pleno desenvolvimento e tem muito mais recursos do que o GeckoFX pode suportar. Você pode encontrá-lo no site da Se7en Soft .

user257033
fonte
1
GeckoFX está sendo desenvolvido ativamente em: bitbucket
Wayne
2

O EO.BrowserControl é rápido e fácil. Possui mecanismo de navegador Chrome e funciona com qualquer versão do .NET

https://visualstudiogallery.msdn.microsoft.com/fcee0646-42e7-484f-b22e-f8b2ace55dd7

Nota: Este é um produto licenciado comercialmente e não o estou promovendo com isso em mente. Depois de experimentar várias outras coisas, acabei escolhendo isso.

user2242746
fonte
2

Atualização 2016:

Existem 3 opções adicionais que posso sugerir:

1. BrowseEmAll.Cef

Um componente .Net que pode ser usado para integrar o mecanismo Chrome ao seu aplicativo .Net. Baseado no CefGlue, mas um pouco mais rápido nas atualizações da versão mais recente do Chrome. Também há uma opção de suporte comercial disponível, que pode ser útil para alguns. Claro que o componente em si é de código aberto .

2. BrowseEmAll.Gecko

Outro componente .Net que pode ser usado para integrar o mecanismo do Firefox ao seu aplicativo .Net. Isso é baseado no Geckofx, mas diferente da versão atual do Geckofx, ele funcionará com uma versão normal do Firefox. Para usar o Geckofx, você precisará criar o Firefox. Novamente, o suporte comercial está disponível, mas o componente em si é totalmente de código aberto .

3. API BrowseEmAll Core

Precisa de todos os navegadores diferentes no seu aplicativo .Net? Com a API BrowseEmAll Core, você pode integrar o Chrome, Firefox, Webkit e Internet Explorer ao seu aplicativo. Este é um produto comercial, portanto, esteja avisado.

(Divulgação completa: trabalho para esta empresa, então leve tudo o que digo com um grão de sal)

daniel.herken
fonte
1

Se você está procurando um bom controle baseado no IE - confira: http://code.google.com/p/csexwb2/

Eu usei em produtos de produção. É muito bom e tem boas demos, embora não pareça estar sendo mantido tão bem agora como costumava ser.

scotru
fonte
1

O Geckofx e o Webkit.net foram promissores no início, mas não se mantiveram atualizados com o Firefox e o Chrome, respectivamente, enquanto o Internet Explorer melhorava, assim como o controle do navegador da Web, embora ele se comporte como o IE7 por padrão, independentemente da versão do IE que você mas isso pode ser corrigido entrando no registro e altere-o para IE9, permitindo o HTML5.

user2319683
fonte
0

Eu tentei todos os navegadores que estão lá fora. Infelizmente, o único que realmente funcionou para mim em todas as circunstâncias foi o EO.Browser. Eu gostaria de ter escolhido uma solução gratuita, mas acabei com o EO.Browser. É muito caro, mas bem conservado.

AntonioC
fonte
0

Atualização 2016:

Para mim, a única alternativa confiável e mantida de navegador para o IE é o EO.WebBrowser. Passei dias e semanas experimentando os outros. Todos eles tiveram alguns problemas que interromperam o show para mim em algum momento.

AntonioC
fonte
1
Bem ... fiquei brincando por uma semana? tentando fazer o MS WebBrowser funcionar - tudo sem sucesso. Não tentei nenhum dos outros =: - {exceto EO.WebBrowser, que funcionou para mim pela primeira vez. Portanto, são 20 minutos com EO e sucesso versus 5 dias com MS e falha ignominiosa completa e total. Tudo o que tenho que fazer agora é encontrar os US $ 750 para comprar 'sucesso' !!!
Richard Hammond
0

Vale a pena dar uma olhada em um produto comercial como o WebKitX aqui: https://www.webkitx.com

insira a descrição da imagem aqui

Ele usa o Chromium Embedded Framework e renderiza HTML5, WebGL, PDF e Flash no Windows XP, 7, 8, 10. Também fornece sabores de controle de 32 e 64 bits.

Oferece acesso DOM usando objetos COM semelhantes ao controle IE WebBrowser:

insira a descrição da imagem aqui

Você pode chamar JavaScript pelo nome da função, passando argumentos escalares (sem usar eval) e também possui retornos de chamada JavaScript para Angular :

insira a descrição da imagem aqui

Você pode adicionar seus próprios objetos COM interoperáveis ​​ao JavaScript:

insira a descrição da imagem aqui

Ele suporta WebGL / WebAudio para jogos HTML5, que você pode desativar para ambientes Citrix:

insira a descrição da imagem aqui

Elias
fonte
Eu o uso na produção e confio totalmente nele. Eu tentei muitos outros e fiquei preso neste navegador. Os desenvolvedores são realmente bons e "pessoais". Não me senti sozinho como com muitos outros. Produto realmente bom e estável.
tmighty 19/01
SO requer isenções de responsabilidade, portanto, seria bom que Elias ressaltasse que ele é o CTO do mobilefx, que é o criador do WebkitX
hko