最近有个项目需要用到高拍仪,高拍仪是第三方厂家生产的产品,我们想将这款产品嵌入我们自己公司的平台系统中,厂家提供的插件SDK的要求有点麻烦, 必须IE7/8/9/11,而实际上虽然客户那边的环境很复杂,代码发布了,在客户那边并不能正常的运行。所以我们决定自己封装一个浏览器,来避免这种版本多样,不兼容的情况。
上面是厂家的环境要求。
原本打算封装一个IE浏览器的,但是好像winform的webbrowser控件,底层调用的也是本机的IE内核。虽然表面上浏览器被封装了,但是其实内核版本还是由应用所在的实际系统环境来决定的。所以最后决定跳到cefsharp(chrome)上来。
CEF(Chromium Embedded Framework, 嵌入式Chromium框架)是C/C++开发的库
目前 Google Chrome(Google浏览器),Chromium浏览器,Opera等都是基于CEF为核心,Webkit引擎的浏览器。
CEFSharp是用C++/CLI的方式来调用CEF类库的。
首先新建一个winform项目,在项目解决方案中使用nuget包管理系统,为系统添加必要的CefSharp包,最主要是下面两个包,注意在安装项中选择对应的版本,根据我的SDK的要求,我这边选择安装了43版本的CefSharp。
同时在生成=》配置管理器中,将活动解决方案平台改成 x86 (CEF不能自适应 x86 | x64,必须选择一个目标),目标平台也必须和解决方案平台一致。
CefSettings cefSettings = new CefSettings();
cefSettings.CefCommandLineArgs.Add("enable-npapi", "1");
cefSettings.CefCommandLineArgs.Add("enable-media-stream", "1");
Cef.Initialize(cefSettings);
由于在我们的项目中需要使用到外部插件,需要开启npapi的功能,所以我们通过以上代码来使能cefsharp的npapi功能。由于我们的高拍仪还需要调用摄像头,所以也是使能了摄像头调用的配置。
cefSettings.CefCommandLineArgs.Add("enable-media-stream", "1");
但是实际上这个代码好像并没什么用。
至此一个简单浏览器就这么被快速的封装好了。
为了测试项目兼容性,所以拿到了win7 32/64,win10 32/64上运行测试,发现项目无法启动,清一色的报以下错误。
错误日志1:
Application: XXXXX.exe(这是应用程序名称就不用真名了)
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileLoadException
Stack:
at XXXXX.MainFrm..ctor()
at XXXXX.Program.Main()
错误日志2:
错误应用程序名称: XXXXX.exe,版本: 1.0.0.0,时间戳: 0x59722183
错误模块名称: KERNELBASE.dll,版本: 6.1.7600.16385,时间戳: 0x4a5bdbdf
异常代码: 0xe0434352
错误偏移量: 0x0000b727
错误进程 ID: 0x1ce0
错误应用程序启动时间: 0x01d302389f209d25
错误应用程序路径: D:\OPC2.0\XXXXX.exe
错误模块路径: C:\windows\syswow64\KERNELBASE.dll
报告 ID: dd19540e-6e2b-11e7-8a73-6c0b84916a41
在windows系统日志中查看错误信息如下。
起初我还以为是运行环境的问题,是由于我的.net framework环境不一致导致的。所以在有些系统中我又安装了.net framework 4 ,也把有些.net framework的版本降低了,效果还是一样,报同样的错误。最后各种折腾,各种找解决方法,最后在一个网友那里发现了一个小细节,原来cefsharp的相关dll,有些dll的运行环境依赖的是Microsoft visual C++ 2012 Redistributable的环境。所以我又去微软官方下载了Microsoft visual C++ 2012 Redistributable的运行包,我已打包好上传CSDN,在此下载。
将vcredist_x64.exe 或者vcredist_x32.exe安装之后,程序正常运行。就此问题解决。