Opções para incorporar o Chromium em vez do controle IE WebBrowser com WPF / C #


158

O controle WPF WebBrowser baseado no Internet Explorer sofre de alguns problemas de teclado e foco e problemas de vazamento de memória . Como uma solução alternativa para esses problemas, estamos considerando as opções disponíveis para hospedar o Chromium em vez do controle WebBrowser em nosso projeto WPF / C # baseado na edição de HTML. Perguntas semelhantes foram feitas aqui anteriormente. Li as respostas e fiz minha própria pesquisa, mas espero obter mais comentários de pessoas que realmente usaram uma das seguintes opções em projetos de qualidade de produção :

Awesomium e Awesomium.NET

Parece muito apropriado, mas não gosto do fato de o projeto não ser de código aberto e o código completo não estar facilmente disponível. Além disso, pode ser um exagero para o nosso projeto, pois a renderização fora da tela não é algo em que realmente dependemos.

Ligações Chromium Embedded Framework (CEF) e .NET para CEF

Esta é provavelmente a melhor opção atualmente disponível. O projeto parece estar ativo e ativo, estando atualmente sincronizado com o Chrome v27. O CEF3 usa a arquitetura de múltiplos processos do Chrome. Também parece que a Adobe está dando algum apoio .

Moldura do Google Chrome

Embora o objetivo original fosse ser um plug-in HTML5 para IE e Firefox, ele também funciona como controle ActiveX autônomo também, para que eu pudesse envolvê-lo para uso com o WPF. Ele expõe uma API suficiente para interação com a página da web interna ( onmessage, addEventListener/removeEventListener, postMessage). Estou ciente de que o Google deve interromper o Chrome Frame, mas presumo que as fontes permanecerão no repositório do Chromium. Não deve ser difícil atualizá-lo com o código Chromium mais recente, e teríamos controle total sobre isso.

Wrapper do WebKit .NET

Não é exatamente baseado em cromo e não usa o mecanismo V8, por isso não é realmente uma opção.

Existe alguma outra opção que eu possa ter esquecido?

Eu gostaria muito que alguém compartilhasse sua experiência com alguma das opções acima para um projeto WPF com qualidade de produção e vida real. Você teve implicações de integração, licenciamento ou implantação? Obrigado.

[EDITADO] Também gostaria de agradecer à artlung por dar um impulso a esta pergunta, oferecendo uma oferta generosa de recompensa.

Respostas:


124

Você já listou as soluções mais notáveis ​​para incorporar Chromium (CEF, Chrome Frame, Awesomium). Não há mais projetos importantes.

Ainda existe o projeto Berkelium (consulte Berkelium Sharp e Berkelium Managed ), mas ele inclui uma versão antiga do Chromium.

O CEF é a sua melhor aposta - é totalmente open source e atualizado com frequência. É a única opção que permite incorporar a versão mais recente do Chromium. Agora que Per Lundberg está trabalhando ativamente na transferência do CEF 3 para o CefSharp , esta é a melhor opção para o futuro. Há também o Xilium.CefGlue , mas este fornece uma API de baixo nível para CEF, vincula-se à API C do CEF. O CefSharp, por outro lado, se liga à API C ++ do CEF.

A Adobe não é o único grande player a usar o CEF; consulte outros aplicativos importantes que usam o CEF na página da Wikipedia sobre a CEF .

A atualização do Chrome Frame não faz sentido, pois o projeto foi retirado .


Você esqueceu de dizer também que metade das coisas não funcionará .. como limpar cookies, cache ... configurar proxies etc. Apenas use o Awesomium e salve o seu problema.

4
Hehe, boa resposta Czarek, obrigado pelo crédito. :) (não tinha visto isso até agora)
por Lundberg 30/10

4
É claro, vale ressaltar: Pode haver coisas "ausentes" em qualquer projeto de código aberto. Nem Xilium.CefGlue nem CefSharp são exceções a essa regra. O bom das coisas de código aberto é que você pode realmente gastar um tempo (razoavelmente baixo) pesquisando um problema menor e incluir sua correção. Vemos isso de tempos em tempos com o CefSharp e é bem legal.
Per Lundberg

1
Corrija-me se eu estiver errado, mas o CefSharp não requer DLLs com mais de 50 MB ao todo? Isso resulta em uma instalação gigante da instalação. O libcef.dll está listado como uma grande dependência e é 38MB
Krafty

2
As configurações de instalação do @Krafty permitem empacotá-lo usando algoritmos como 7z e isso resulta em tamanho reduzido de 55 MB -> para 17 MB. O tamanho do CefSharp não é muito comparado ao Google Chrome, que tem 152 MB descompactado e 40 MB de configuração.
Czarek Tomczak

11

Tivemos exatamente o mesmo desafio há algum tempo. Queríamos ir com a biblioteca de código aberto CEF3, que é baseada em WPF e suporta .NET 3.5.

Em primeiro lugar, o autor da CEF se listados ligação para diferentes idiomas aqui .

Em segundo lugar, seguimos em frente com a ligação de código aberto .NET CEF3, chamada Xilium.CefGlue, e tivemos um bom sucesso. Nos casos em que algo não está funcionando como o esperado, o autor geralmente responde muito bem aos problemas abertos no rastreador de bitbucket incorporado

Até agora, isso nos serviu bem. O autor atualiza sua biblioteca para oferecer suporte às versões mais recentes do CEF3 e correções de bugs regularmente.


2
Este é realmente um ponto (vindo do "outro lado", sendo o CefSharp nisso) - o CefSharp é 4.0 apenas há alguns meses, devido a problemas no suporte ao 3.5 com conjuntos de ferramentas VS mais recentes. (VS2010 + não pode apoiar os quadros mais velhos com C ++ / CLI, que é um pouco triste, porque nos obriga a usar o .NET 4 ou uma versão muito antiga Visual Studio ...)
Per Lundberg

8

Aqui está outro:

http://www.essentialobjects.com/Products/WebBrowser/Default.aspx

Este também é baseado no mais recente mecanismo Chrome, mas é muito mais fácil de usar que o CEF. É uma única DLL do .NET que você pode simplesmente referenciar e usar.


O apoio também é fantástico.
21814 huseyint

3
Parece que faltam informações básicas nesse site - que versão do Chrome inclui?
Czarek Tomczak

2
Ah, não é de graça. NÃO É GRATUITO. O que esses caras estavam pensando? :)
dkellner

Deve-se declarar aqui que, embora haja uma versão de teste, ela não é gratuita.
ewilan

8

Dê uma olhada na biblioteca DotNetBrowser desenvolvida pela equipe a que pertenço. 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, configure a comunicação baseada no WebRTC e muito mais .

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

O snippet 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.


1
parece válido e eu incorporei a versão de avaliação no meu aplicativo. O único problema é que é um produto comercial e a licença não é muito barata. Caso contrário, parece sólido para mim.
DoronG

Infelizmente DotNetBrowser NÃO é de graça! : /
Deniz

4

Eu usei o Awesomium.NET. Embora eu não goste do fato de não ser de código aberto e também de usar um mecanismo de renderização Webkit bastante antigo, é realmente fácil de usar. Esse é o único endosso que posso dar.


1
Você poderia compartilhar o tamanho da sua base de usuários para esse projeto, aproximadamente?
noseratio 16/08

Na verdade, nunca implantei o projeto, portanto a base de usuários era zero. Eu só estava experimentando opções.
Ming Slogar

2
Sofri por meses suportando um aplicativo C # baseado em Awesomium; pode ser bom para jogos em C ++, mas em C # o controle de seu navegador é totalmente incorreto. A implantação complicada (você precisa do instalador estranho para adicionar itens ao GAC), o comportamento do buggy (às vezes é iniciado com uma tela preta, o usuário deve reiniciar o aplicativo manualmente) e a velocidade lenta (as páginas da Web NÃO são exibidas à medida que carregam , isso meio não reage até que a página é totalmente / parcialmente carregado, e leva 5-10 segundos para inicializar em um slowish-máquina)
theflash

5
Finalmente fui com o CefSharp e os resultados foram surpreendentes. Inicialização de <100 ms (ou seja, inicialização instantânea) e nenhum "erro". Coisas simplesmente funciona. Como deveria. Além disso, o CefSharp NÃO precisa ser adicionado ao GAC, portanto, não são necessárias alterações no instalador. Basta copiar seus arquivos e pronto. Mencionei que o CEF / CefSharp é melhor do que todas as bibliotecas Mozilla / WebKit C # que testei? Ah, e pelo amor de Deus, não use o IE. Funciona. Sim, sim, mas é totalmente inexistente e apresenta um desempenho muito ruim (velocidade).
TheFlash

1
@RobinRodricks Exatamente a minha experiência também. Eu quase desisti da abordagem, mas então encontrei o CefSharp :-) (e quem se importa com mais alguns MBs hoje em dia, quando os drivers de impressora vêm em um DVD :-)?)
Xan-Kun Clark-Davis


2

Eu tive o mesmo problema com o meu leitor de RSS WPF; originalmente eu fui com o Awesomium (acho que a versão 1.6) O Awesomium é ótimo. Você tem muito controle sobre armazenamento em cache (imagens e conteúdo HTML), execução de JavaScript, interceptação de downloads e assim por diante. Também é super rápido. O isolamento do processo significa que, quando o navegador trava, ele não trava o aplicativo.

Mas também é pesado, até a compilação de lançamentos adiciona cerca de 10 a 15 mb (não me lembro o número exato) e, portanto, uma pequena penalidade de inicialização. Então percebi que o único problema que tinha com o controle do navegador IE era que ele lançava os erros de JavaScript de vez em quando. Mas isso foi corrigido com o seguinte trecho.

Eu mal usei meu aplicativo no XP ou Vista, mas no Win 7 e acima nunca travou (pelo menos não porque usei o controle do navegador IE)

IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
    IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
    Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");

    webBrowser;
    sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
    if (webBrowser != null)
    {
        webBrowser.GetType().InvokeMember("Silent", 
                BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
    }
}

Obrigado pela resposta. Então você voltou ao Awesomium para o IE?
Noseratio 21/08

Sim eu fiz. e eu tenho sido feliz. Eu uso o ClickOnce para que o implementável fosse pequeno e sem congelamento de inicialização!
Sameer Vartak

Obrigado, votei sua resposta com êxito. BTW, há outra maneira de obter a IWebBrowser2interface interna .
noseratio 21/08

Legal. os controles Activex funcionam no WPF? Obrigado pela votação :-)
Sameer Vartak

Desculpe, não leu o link de referência com atenção. Sim, é uma amostra XAML e funciona. Obrigado.
Sameer Vartak

1

A Microsoft está lançando o controle WPF " Microsoft Edge WebView2 " que nos proporcionará uma ótima opção gratuita para incorporar o Chromium no Windows 10, Windows 8.1 ou Windows 7. Ele está disponível via Nuget como pacote Microsoft.Web.WebView2.


Esta é uma ótima opção, embora seja 2020 e hoje em dia eu estaria procurando uma solução de plataforma cruzada, por exemplo, Chromely .
noseratio

1
Acho que depende se você deseja adicionar um pouco de material da web a um aplicativo de desktop ou a um aplicativo de desktop criado como um aplicativo da web. Eu acho que você usaria o WebView2 apenas se fosse um pouco da Web para um aplicativo de desktop.
scottheckel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.