winform中用各种方式嵌入WebKit内核的参考

因为工作,最近接触一个WinForm项目。在这个项目中,有一些复杂报表的展示,因为dev做起来图表比较复杂,公司给了我一些HTML5的页面,我这边用winform的控件加载网页。

事实是,webbrowser控件默认的是ie7的加载方式,微软的ie在js和bootstrap方面真的我都不想吐槽了,然后我就想到能不能搞一下其他的浏览器内核进去(起初,我觉得只要把默认的ie7换成其他的版本加载应该就没问题了,我试过用修改注册表的方式把默认的ie7换成ie8或者ie11,但是问题是尽管已经换成了ie11来加载H5页面,仍然有存在不能识别一些js方法的情况,当然,可以尝试一下,这里给一个参考:https://blog.csdn.net/wangdaoyin2010/article/details/50691358)。

给控件换内核这条路并不好走,我尝试过原生的WebKit.Net,openWebKitSharp,CefSharp,EO.WebBrowser这一系列WebKit的封装,也尝试过Gecko等Firefox的封装,但都不太满意。

具体说一下原因,WebKit.Net以及openWebKitSharp来说,效果还算满意,用这两个插件出来的页面和Chrome出来的页面存在一些细微的差别,但并不影响(这里提一句,Chrome用的内核也就是WebKit),问题是这两个组件已经很久没有更新过了,有一些问题可能会遇到未知的麻烦,而且你无法解决,当然,我的问题是这两个组件有一个通病,我在打包的时候,他会报一个bug,说找不到WebKit的引用,我不知道问题可能出在哪儿,当然我也根本不关心问题出在哪儿。给一个WebKit.Net的参考:https://blog.csdn.net/ma_jiang/article/details/53812117

然后我说一下EO.WebBrowser,这个组件是一直在更新的,功能也比较齐全,用的内核依然是WebKit的封装,但是这个是要收费的,不能商用,尽管效果非常好。参考资料:https://www.essentialobjects.com/Products/WebBrowser/WinForm.aspx

然后就是Gecko了,这个我也不清楚是什么问题,我在nuget中安装了这个组件,但是当我运行的时候会提示我找不到一个dll或者是他的底层引用,我猜测可能是环境或者dll缺失的原因,但是在那么多的没有依赖的dll中,我怎么知道它到底缺了什么,所以,我果断放弃。

cefSharp有很多各式各样的版本,ASP啊,Wpf啊,winform啊都有,这也是一个到现在为止一直在更新,使用量也是最多的插件,仍然是WebKit的内核,虽然不能支持AnyCPU(当然AnyCPU也是可是实现的),但是只要你把项目设置成x86或者x64,就可以跑起来,而且加载速度确实很快,有很多的例子供你参考。我之所以没有用这个,是因为在打包的时候又出现问题了,一些第三方的dll在打包的时候不管怎么样都无法复制到本地,也就意味着我发布到服务器上面后就会找不到引用(原谅楼主用的是VS自带的Windows installer打包),如果你用其他的工具打包,这个问题将迎刃而解,但是我不想搞的那么麻烦。这个就不给参考了,网上资源有很多,一抓一大把那种,只要你搜索CefSharp就可以了。

最后,我用了Awesomium.Windows.Forms这个插件,简单介绍一下,Awesonmium 是一个允许把网页嵌入到 3D 画面或游戏中的开源库。Awesomium 采用了目前业界速度最快的浏览器内核webkit和v8(Google Chrome浏览器的内核),并且能很好得支持flash。官方网站:http://www.awesomium.com/ 但是官网好像是不可用的,不要caer这些detail。按照上面的问题来看,你应该知道我为什么要看中这个插件,没错,就是封装的很好,便于我打包啦!

以上我说的所有插件,都可以在nuget上面找到的。以Awesomium.Windows.Forms为例,在VS的Nuget程序包或者控制台上安装好插件后,就可以直接用了。这里给一个简单的示例:

Awesomium.Windows.Forms.WebControl bro;
bro = new Awesomium.Windows.Forms.WebControl();
bro.Dock = DockStyle.Fill;
bro.Name = "webControl1";
bro.Source = new System.Uri("http://www.baidu.com", System.UriKind.Absolute);
this.Controls.Add(bro);

补充一点,在窗口关闭的时候一定要Dispose一下这个控件,不然会引发线程的不安全。

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
      bro.Dispose();
 }

当然,你也可以用WebView的方式来构建页面,代码如下:

using ( webView = WebCore.CreateWebView( 800, 600 ) )
{
    webView.Source = new Uri( "http://www.google.com" );
    view.LoadingFrameComplete += ( s, e ) =>
    {
        if ( !e.IsMainFrame )
            return;
        BitmapSurface surface = (BitmapSurface)view.Surface;
        surface.SaveToPNG( "result.png", true );
        WebCore.Shutdown();
    }
}
WebCore.Run();

网上关于这个插件的资料太少,这里我给一个API的参考文档,有兴趣的同学可以下来研究一下:http://docs.awesomium.net/#

以上,就是就是本次全部内容了!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值