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

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

Tanto quanto eu entendo, o controle WebBrowser é um invólucro para o IE , o que não seria um problema, exceto que parece que é uma versão muito antiga do IE , com tudo o que implica em termos de falhas de CSS, potencial de segurança riscos (se o mecanismo de renderização não foi corrigido, posso realmente esperar que os problemas de estouro de buffer zillion sejam corrigidos?) e outros problemas.

Eu estou usando o Visual Studio C # (edição expressa – faz alguma diferença aqui?)

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

Eu preciso:

  • Um navegador que pode integrar 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 com 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 sobre o Chrome, uma vez que vem sob a licença BSD, mas eu ficaria tão 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 controle WebBrowser existente, o que já faz cerca de 70% do que eu preciso, mas não acho que isso seja possível.

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

Estou aberto a sugestões

Check CefSharp .Net bindings, um projeto que comecei um tempo atrás que, felizmente, foi pego pela comunidade e se transformou em algo maravilhoso.

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

Ele possui controles de navegador para WPF e WinForms e possui vários resources e pontos de extensão. Ser baseado no Chromium também é incrivelmente rápido.

Pegue no NuGet: Install-Package CefSharp.Wpf ou Install-Package CefSharp.WinForms

Confira exemplos e dê seus pensamentos / feedback / pull-requests: https://github.com/cefsharp/CefSharp

Licenciado BSD

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

  • Incorporando o Webkit com C #
  • Incorporando Gecko (Firefox engine) com c #

O webkit não é ótimo como os outros estados de resposta, uma versão não funciona mais (o google code one) e o Mono é experimental. Seria bom se alguém fizesse um esforço para criar um wrapper .NET decente para ele, mas não é algo que alguém pareça querer fazer – o que é surpreendente, já que agora tem suporte para HTML5 e muitos outros resources que o IE (8 ) o motor não tem

Atualização (2014)

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

Eu acho que este é o navegador usado pelo Origin em Battlefield 3.

Atualização (2016)

Existe agora o DotnetBrowser , uma alternativa comercial ao Awesomium. É baseado no Chromium.

Eu tenho testado alternativas para o componente C # Web browser por alguns dias agora e aqui está minha lista:

1. Usando novas versões do IE 8,9:

Componente de navegador da Web é IE7 não IE8? Como mudar isso?

Prós:

  • Não é necessário muito trabalho para funcionar
  • algum suporte a HTML5 / CSS3 se o IE9 estiver cheio, se o IE10

Contras:

  • Máquina de destino deve ter a versão do IE de destino instalada, o IE10 ainda está em pré-visualização no Win7

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

2. OpenWebKitSharp

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

Prós:

  • Ativamente desenvolvido
  • Suporte HTML5 / CSS3

Contras:

  • Muitos resources não implementados
  • Não suporta x64 (App deve ser construído para x86)

O OpenWebKit é muito bom, apesar de muitos resources ainda não estarem implementados, eu experimentei alguns problemas usando o visual studio, o que gera uma referência de object nulo aqui e então no modo de design, existem alguns problemas js. Todo mundo que usa isto quase notará imediatamente que o alerta de js não faz nada. Eventos como mouseup, mousedown … etc não funcionam, arrastar e soltar js é buggy e assim por diante ..

Eu também tive algumas dificuldades de instalá-lo, uma vez que requer versão específica do VC redistribuível instalado, então após a exceção eu olhei para o log de events, encontrei a versão do VC e instalei-o.

3. GeckoFX

Prós:

  • Funciona em mono
  • Ativamente desenvolvido
  • 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̶) ̶ – veja os comentários abaixo

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

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

  1. Baixe GeckoFx-Windows-16.0-0.2 , aqui você pode verificar se o mais novo está disponível GeckoFX
  2. Adicione referências a duas dlls baixadas
  3. Como o GeckoFX é o wrapper, você precisa do XulRunner, vá para a lista de versões para ver qual deles você precisa
  4. Agora que sabemos qual a versão do XulRunner que precisamos, vamos para as versões do Mozilla XulRunner , vá para a pasta de versão -> runtimes -> xulrunner- (your_version) .en-US.win32.zip, no nosso caso xulrunner-16.0. US.win32.zip
  5. Descompacte tudo e copie todos os arquivos para o seu bin \ Debug (ou libere se o seu projeto estiver configurado para liberar)
  6. Vá para o visual studio designer do seu formulário, vá para a checkbox de ferramentas, clique com o botão direito dentro -> Escolher itens -> Procurar -> Localizar baixado GeckoFX winforms dll arquivo -> OK
  7. Agora você deve ter novo controle GeckoWebBrowser

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

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

Eu tive o mesmo problema, o WebBrowser estava usando uma versão antiga do IE, com alguns googling me deparei com o seguinte código que faz uma mudança no registro e faz com que o WebBrowser use a última versão do IE possível:

  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 class e colocar este código nela, então execute o seguinte código quando o programa iniciar:

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

Veja o controle do Mono.WebBrowser – ele incorpora o Gecko (usado pelo Firefox) ou o WebKit (usado pelo Safari) no WinForms (sem usar o ActiveX).

Eu sei que isso não é um controle WebBrowser ‘substituição’, mas eu estava tendo alguns problemas de renderização horríveis, enquanto mostrando uma página que estava usando Bootstrap 3 + para layout etc e, em seguida, eu encontrei uma postagem que sugeria eu uso o seguinte. Aparentemente, é específico para o IE e diz para usar a última variação encontrada na máquina cliente para renderização (portanto, não usará o IE7 como acredito que seja padrão)

Então, basta colocar:

  

em algum lugar na parte principal do seu documento.

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

Boa sorte.

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

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

Aqui estão alguns outros resources úteis, fornecidos pelo DotNetBrowser: é possível ouvir events de carregamento, lidar com atividades de rede, configurar proxy, simular ações de usuários, trabalhar com cookies, acessar e modificar DOM, ouvir events DOM, chamar JavaScript de .NET e vice-versa, use a webcam e o microfone na página da Web, configure a comunicação baseada em WebRTC e muito mais .

Confira a referência da API para mais detalhes.

O snippet de código abaixo demonstra como criar um BrowserView, incorporá-lo a 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, no entanto, é gratuita para uso em projetos Open-Source e Academic. Licenças comerciais incluem pacotes de suporte para diferentes tamanhos de equipe. Também é possível adquirir o código-fonte da biblioteca.

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

Eu tentei um punhado de variantes do Webkit, mas na minha experiência nada supera os avanços que o OpenWebkitSharp tem. Adore, adoro isso. As pontuações em HTML5 e CSS3 estão o mais próximas possível do Google Chrome. API muito agradável e modelo de events. Se você encontrar APIs “não implementadas” provavelmente porque elas não estão implementadas no Webkit. Tudo mais funciona muito bem.

O OpenWebKitSharp é um wrapper .net para o mecanismo de webkit baseado no projeto WebKit.NET 0.5. Adiciona mais funcionalidade à versão 0.5 e fornece mais methods do que essa versão. O OpenWebKitSharp suporta a compilation Cairo (0.5) e as compilações noturnas do webkit (Nightly por padrão). Na versão 1.5 estável e mais a compilation noturna é incluída e copiada automaticamente após a construção. Nas versões anteriores, isso acontece com a versão do cairo. O OpenWebKitSharp ativa atualmente o GTLite Navigator, um navegador da Web rápido, estável e flexível.

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

Eu usei GeckoFX e me serve muito bem. Ele usa o mecanismo do Firefox. A única ressalva que eu já encontrei com isso, é que ele emite o evento “DocumentLoaded” uma vez antes do documento estar totalmente carregado … Eu acho que ele triggers um quando o HTML é carregado, e outro quando todo o imagens e outras coisas são carregadas. Eu consertei isso simplesmente ignorando o primeiro, e ele funcionou lindamente sem falhar até agora.

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

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

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

O EO.BrowserControl é rápido e fácil. Tem o motor do 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 estou promovendo isso com isso em mente. Depois de experimentar várias outras coisas, acabei escolhendo isso.

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 do Chrome em seu aplicativo .Net. Baseado no CefGlue, mas um pouco mais rápido em atualizações para a 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 em seu aplicativo .Net. Isso é baseado no Geckofx, mas ao contrário da versão atual do Geckofx, isso funcionará com uma versão normal do Firefox. Para usar o Geckofx, você precisará construir o Firefox. Novamente, o suporte comercial está disponível, mas o componente em si é totalmente open source .

3. API do BrowseEmAll Core

Precisa de todos os diferentes navegadores em seu aplicativo .Net? Qual API BrowseEmAll Core você pode integrar o Chrome, Firefox, Webkit e Internet Explorer em seu aplicativo. Este é um produto comercial, por isso esteja avisado.

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

ATUALIZAÇÃO 2018 MAIO

Se você está direcionando o aplicativo para ser executado no Windows 10, agora você pode incorporar o navegador Edge ao seu aplicativo .net usando o Windows Community Toolkit .

Exemplo de WPF:

1) Instalar o Pacote Nuget do Windows Community Toolkit

 Install-Package Microsoft.Toolkit.Win32.UI.Controls -Version 3.0.0-preview 

2) Código XAML

      

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.

Nota: Esta biblioteca está em seu estágio de pré-visualização.

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

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

O Geckofx e o Webkit.net foram promissores no começo, mas não acompanharam o Firefox eo Chrome, respectivamente, enquanto o Internet Explorer melhorou, assim como o Webbrowser, embora ele se comportasse como o IE7 por padrão, independentemente de qual versão do IE você tem, mas isso pode ser corrigido, indo para o registro e alterá-lo para o IE9 permitindo HTML5.

Confira o controle do GeckoFX .

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 livre, mas acabei com o EO.Browser. É bastante caro, mas bem conservado.

Atualização 2016:

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