需求背景:
最近接到一个白板声译实时字幕的任务,展示从socket中读取的实时字幕,要求以windows窗体的形式展示,直觉这种前端展示的东西用网页的形式来呈现比较好控制样式,于是想在winform窗体内嵌入一个浏览器内核,字幕以网页的技术来实现。
技术选型:
浏览器内核可以用winform自带的控件webbrowser、chrome的内核的ChromiumWebBrowser。经过调研webbrowser默认的背景为白色,需求里面字幕背景颜色要求为蓝色,所以网页刷新的过程中会出现闪烁的问题,并且因为稳定性的问题也会偶尔闪烁白色的背景,相对之下ChromiumWebBrowser则没有这些问题,故选择CefSharp来渲染网页。
实现遇到的坑点:
webbrowser因为是微软封装的控件,从开发到部署都比较简便,但是遇到以上的问题时比较难以找到解决办法。相对之下,CefSharp自身则为我们排除了以上那些问题,但是实施过程则较为繁琐。简单步骤如下:
1、用vs2017创建一个windows程序项目,平台配置为Any CPU, 需要添加CefSharp依赖包,对于有外网权限的则可以直接通过在nuget中搜索cefsharp,在搜索结果中选择CefSharp.WinForms安装即可
nuget会自动的解析对应的依赖包,最终得到的安装包为
并且自动添加到项目引用当中,可以看到,引用了如下dll
这里依赖包就安装完成了,然后在程序中就可以直接调用了:
var extensionForm = new Form();
var extensionBrowser = new ChromiumWebBrowser(url);
//extensionBrowser.IsBrowserInitializedChanged += (s, args) =>
//{
// extensionBrowser.ShowDevTools();
//};
extensionForm.Controls.Add(extensionBrowser);
extensionForm.Show(this);
但是如果开发环境没有外网权限,是手动将上述下载的4个依赖包放进packages文件夹下面的,需要手动的配置好对应的依赖关系,首先在vs中将上述三个引用dll添加成功。此时代码能编译通过,但是运行起来程序会报错:找不到CefSharp.Core.Runtime.dll或对应的依赖文件。是因为还需要手工添加配置项到.csproj文件中,可以先卸载项目然后编辑该项目文件,添加如下三项
然后再运行程序则会正常的渲染出对应的网页。
2、打包程序我使用的是Visual Studio Setup Projects工具生成为msi文件。如果没有Visual Studio Setup Projects扩展工具还需要先在vs扩展工具中下载安装此工具,然后创建安装项目
先添加项目输出,即为刚才创建的使用了CefSharp的windows窗体项目,vs自动会将检测到的依赖文件都加入进来,但是打开项目Debug目录发现CefSharp生成了很多运行时所依赖的文件,
但是x86和x64这两个文件夹并没有被添加进来,我们从生成目录下面把把他们手动的添加进来即可,这里注意,根据安装项目配置的平台(如下图)只需要添加x86或者x64即可。
这里选择x64,则只需将x64文件夹复制进来即可
否则会因为x86程序和目标平台不一致而编译报错。
到这里就可以编译打包程序生成msi文件了,安装,运行程序,程序报错:未找到CefSharp.Core.Runtime.dll或对应的依赖文件,这个之前直接运行CefSharp程序时也出现过,于是想到可能又是缺少什么配置,简单粗暴的做法是:用beyond compare工具直接比对安装生成的文件和用vs编译生成的文件,发现vs生成的.exe.config文件中包含一个配置项而安装生成的.exe.config中并没有
不知道为什么会这样,但是我可以直接先将这个配置添加到App.config中然后安装程序输出的.exe.config文件中就一定会有这个配置,这样程序就具备成功运行的所有条件了。
3、CefSharp运行平台所必须具备的环境。
一个CefSharp程序要成功运行,必须具备两个条件。
1、.net framework 4.5+
2、vc++2015
如果目标机器上没有vc++2015,可以采用xcopy的方式。即为,若程序为x86或者x64则将对应的运行时文件放在程序根目录即可,若为Any CPU,则需要根据机器环境在代码中做Load操作,具体参阅:https://www.cnblogs.com/Soar1991/p/14164100.html。
4、最后总结。
知易行难,工作了若干年CefSharp在工作中算是司空见惯的一个工具,但是以前都没有亲自搭建框架过,这次身体力行一会,还是纠结了一下下,故写此文章记录一下,给予需要的人一点方便,节省时间。