项目背景:

公司的XX产品需要升级和以后支持多平台的使用。因为之前项目是由WPF实现的。目前以后想作为Html5来展示页面。

因为涉及到整体更改遇到的问题较多以及其他原因,所以只是内部内容区域先替换为Html5页面,所以需要嵌入Browser控件。

Browser控件的选型:

1.Winform中的WebBrowser

2.WPF中的WebBrowser

3.WebKit.Net

4.CefSharp

5.awesominum

6.OpenWebKitSharp

7. geckofx

经过初步查阅,WebKit.Net、OpenWebKitSharp 和geckofx 都是基于Winform的。CefSharp 在GitHub有源码,并且具备Winform和WPF的版本。awesominum可以允许把网页嵌入到 3D 画面或游戏中,支持unity3D。

经过尝试.Net中的Winform版本的WebBrowser,背景无法直接设置透明, 需要通过Windows Api进行处理(仅查阅,未实际进行处理和验证)。

首先把Winform的WebBrowser放到项目中进行了实验和处理,发现两个致命问题:一个是背景不透明,因为整个背景具有渐变和过渡效果。第二个是,页面切换具有滑动过渡效果。

Winform版的WebBrowser会悬浮最上层,不会渐变隐藏消失。  基于以上两点,针对Winform和基于Winform的其他暂时不在考虑。

(调研其他基于Winform的第三方控件没有具体查看是否内部已经处理这些问题,喜欢深入研究的同学或使用过的同学也可以告诉我啊)

目前 调研CefSharp和Awesominum。

CefSharp的源码Demo进行测试,目前是符合需求。Awesominum初步查看也符合需求。

特定需求:在某个Html5页面中 需要调用摄像头进行录像拍摄。

现象:在CefSharp的初步显示具备摄像头打开的页面时,无法打开摄像头。开始查找问题,最后发现 要给CefSharp的CommandLineArgs添加一些命令才可以显示处理,并且要启动WebServer服务。(后面会详细讲解此问题)

而在Awesominum中未找到可以添加命令行参数的方法,所以姑且放弃。最好还是先选用CefSharp。

目前,引用CefSharp,我是通过Nuget进行获取安装的。

关于Nuget的使用,大家可以自行搜索使用。Nuget还可以自己搭建公司专属的插件服务器和客户端调用。

其中需要注意的是:

1.使用正确的Package source资源地址进行搜索下载。

如下图,在搜搜CefSharp的时候,要使用nuget.org地址或All下载资源,这样才能搜索到CefSharp,Microsoft Visual Studio Offline Packages 则是针对微软的一些插件和应用包。

关于使用CefSharp的坎坷之路

2.插件的安装和卸载都要要用Nuget进行处理

在使用过程中,有时候会遇到解决方案打开,然后操作生成项目时,提示正在恢复还原Nuget包,然后,然后,就一直然后了... 那叫个等的花都谢了。强制关闭,下次还是会有滴。还是放弃抵抗吧。

如果Nuget的包恢复和还原出来错活着不需要了,还是通过Nuget进行卸载,以免有残留。真是不使用不知道,一使用全乱套,啊哈哈~~~~

纯属个人体会,个中滋味,各自体会。

----------------以下为使用CefSharp过程中,个人遇到的一些问题和注意事项------------------------

一:引用CefSharp的编译需要指定目标平台X86或X64

    在我们解决方案中,一般默认都是AnyCup的,所以在生成时会提示错误。

关于使用CefSharp的坎坷之路

因为CefSharp的使用需要明确目标平台的。所以生成时,要指定是x86还是x64,因为我们项目需要 要改为X86.  有的会问,我已经修改目标平台为x86了,如下图 位置:1、2处。而编译还是生成不成功呢?这是为什么呢?为什么呢?

请不要在项目的属性上进行设置。要在整个解决方案的配置上进行设置 引用CefSharp的项目的Platform 平台。仔细看你会发现 解决方案的的项目的平台如下图 位置3处和 项目属性中是不一致的呢。所以切记。

关于使用CefSharp的坎坷之路

二:CefSharp中的生成目录的问题

在我们项目中,CefSharp的项目是作为插件的方式嵌入主框架中的,所以生成目录到了根目录下的Plugins目录下。运行后,你会发现一直提示无法找到CefSharp.core.dll等相关的dll文件。  哈哈,找不到,找不到就对了。

CefSharp是到根目录下(默认是指Bin)的环境中寻找dll的,所以无法进行找到。暂时也未从源码案例中找到进行设置目录的方式(若其他忍知晓可以告知我哦)。

不过这样也不要紧,不就是在程序的运行环境中找不到吗?我们自己添加上不就行了。代码如下:

  var pluginsPath = Path.Combine(Environment.CurrentDirectory, "Plugins");
  var path = Environment.GetEnvironmentVariable("PATH") + ";" + pluginsPath;
  Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Process);

  在程序运行启动时,把对应的环境变量路径添加上Plugins的路径。运行起来,你会发现可以了。

三:关于CefSharp生成时产生的各种文件是否项目都必须用到的问题

    比如,生成的文件中有扩展名为.pak的文件,pak文件是一种特殊的文件压缩格式。 比较常应用于游戏。 关于此类文件,在使用CefSharp也需要具备此类文件。 
网上搜索:将locales及其下所有都设置为输出,里面有个en-US.pak文件,如没有,则应用程序会启动显示错误退出。再将devtools_resources.pak 设置为输出,否则调用devtools时将报错不能打开。(常见问题官网解释)
通过在CefSharp的源码中搜索也确实使用到了pak文件,所以此类文件也不可缺少。

四:关于CefSharp显示页面一直闪烁的问题。

      具体查找过程就不详述,只能一把鼻涕一把泪的说 那也是一个煎熬的过程,不能说问题有多大,只能说很小的问题,没有找对方向。现在就把问题告诉大家。   

      经过和从GitHub下载的CefSharp3的源码进行对比,最终发现,我们未进行配置app.manifest文件的配置,大神们也许很多app.manifest文件的用途,而对于我这种不踩一两次坑,不长教训的,以前都会轻轻掠过这种东西。

      app.manifest的文件可以通过添加文件来自动生成。也可以从源码中拷贝过来。然后在项目的属性=》应用(Application)中进行Resources=》Manifest配置上。下面描述app.manifest的描述的功能。

     其中主要 代码片段入下:

     

 1  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
 2     <application>
 3       <!-- A list of the Windows versions that this application has been tested on and is
 4            is designed to work with. Uncomment the appropriate elements and Windows will 
 5            automatically selected the most compatible environment. -->
 6 
 7       <!-- Windows Vista -->
 8       <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
 9 
10       <!-- Windows 7 -->
11       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
12 
13       <!-- Windows 8 -->
14       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
15 
16       <!-- Windows 8.1 -->
17       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
18 
19       <!-- Windows 10 -->
20       <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
21 
22     </application>
23   </compatibility>
24 
25   <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
26        DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need 
27        to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should 
28        also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
29   
30   <application xmlns="urn:schemas-microsoft-com:asm.v3">
31     <windowsSettings>
32       <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
33     </windowsSettings>
34   </application>
app.manifest的主要代码

相关文章:

  • 2021-12-14
  • 2022-12-23
  • 2021-11-12
  • 2022-02-17
  • 2021-11-29
  • 2021-05-23
  • 2021-08-08
  • 2021-10-03
猜你喜欢
  • 2021-05-28
  • 2021-06-21
  • 2021-08-21
  • 2021-06-30
相关资源
相似解决方案