一个 CefSharp 应用程序要想正确运行,有两个必要条件:

  1. .NET Framework 4.5.2

  2. VC++ 2015

在部署 CefSharp 应用时经常会遇到因为没有 VC++ 2015 而无法运行的问题:

通过事件查看器,可以观察到一个类型为:System.IO.FileNotFoundException 的异常。

检测 VC++ 2015 运行环境是否安装。

我们可以使用以下 C# 代码来检测本机上是否已经部署了 VC++ 2015 运行环境:

public static bool IsVc2015Installed(){var dependenciesPath = @"SOFTWARE\Classes\Installer\Dependencies";var plat = Environment.Is64BitProcess ? "x64" : "x86";using (var dependencies = Registry.LocalMachine.OpenSubKey(dependenciesPath)){if (dependencies == null){return false;}foreach (var subKeyName in dependencies.GetSubKeyNames().Where(n =>!n.ToLower().Contains("dotnet") && !n.ToLower().Contains("microsoft"))){using (var subDir = Registry.LocalMachine.OpenSubKey(dependenciesPath + "\\" + subKeyName)){if (subDir == null){continue;}var value = subDir.GetValue("DisplayName")?.ToString() ?? null;if (string.IsNullOrEmpty(value)){continue;}if (Regex.IsMatch(value, $@"C\+\+ 2015.*\({plat}\)")) //here u can specify your version.{return true;}}}}return false;}

内置 VC++ 2015 运行时文件

VC++ 2015 运行环境是可以通过 XCopy 部署的。即:如果我们的程序需要 VC++ 2015 运行环境,仅需将 VC++ 2015 的全部文件复制到应用程序目录即可。事实上,有很多商业软件也是这么做的,比如:Navicat 。应用程序目录下一系列 “api-ms-win” 开头的 DLL 文件就是运行时文件。

当我们的 CefSharp 的目标平台仅为 x86 或 x64 ,内置 VC++ 2015 运行时仅需将对应的文件复制到输出目录即可。

如果要启用 AnyCPU 支持,我们仍需为主程序装载 VC++ 2015 运行时。

启用 AnyCPU 支持

以上一篇 让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案 的代码为模板,在 Program 文件中增加 _dllLoaded 变量来保存 VC++ 2015 环境是否已经具备。在 Program 类型的静态构造函数中调用 IsVc2015Installed 函数来确认是否已经安装了 VC++ 2015 环境,并将结果赋值给 _dllLoaded 变量。这代表着,如果本机已经安装过 VC++ 2015 运行环境,则程序内置的环境将不会被加载。

可以使用以下 Windows API 加载非托管类库:

[DllImport("kernel32.dll")]private static extern IntPtr LoadLibrary(string lpFileName);

声明静态的只读字符串数组变量 DllList 用于保存 VC++ 2015 的全部文件名:

private static readonly string[] DllList ={"api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-datetime-l1-1-0.dll","api-ms-win-core-debug-l1-1-0.dll", "api-ms-win-core-errorhandling-l1-1-0.dll","api-ms-win-core-file-l1-1-0.dll", "api-ms-win-core-file-l1-2-0.dll","api-ms-win-core-file-l2-1-0.dll", "api-ms-win-core-handle-l1-1-0.dll","api-ms-win-core-heap-l1-1-0.dll", "api-ms-win-core-interlocked-l1-1-0.dll","api-ms-win-core-libraryloader-l1-1-0.dll", "api-ms-win-core-localization-l1-2-0.dll","api-ms-win-core-memory-l1-1-0.dll", "api-ms-win-core-namedpipe-l1-1-0.dll","api-ms-win-core-processenvironment-l1-1-0.dll", "api-ms-win-core-processthreads-l1-1-0.dll","api-ms-win-core-processthreads-l1-1-1.dll", "api-ms-win-core-profile-l1-1-0.dll","api-ms-win-core-rtlsupport-l1-1-0.dll", "api-ms-win-core-string-l1-1-0.dll","api-ms-win-core-synch-l1-1-0.dll", "api-ms-win-core-synch-l1-2-0.dll","api-ms-win-core-sysinfo-l1-1-0.dll", "api-ms-win-core-timezone-l1-1-0.dll","api-ms-win-core-util-l1-1-0.dll", "api-ms-win-crt-conio-l1-1-0.dll","api-ms-win-crt-convert-l1-1-0.dll", "api-ms-win-crt-environment-l1-1-0.dll","api-ms-win-crt-filesystem-l1-1-0.dll", "api-ms-win-crt-heap-l1-1-0.dll","api-ms-win-crt-locale-l1-1-0.dll", "api-ms-win-crt-math-l1-1-0.dll","api-ms-win-crt-multibyte-l1-1-0.dll", "api-ms-win-crt-private-l1-1-0.dll","api-ms-win-crt-process-l1-1-0.dll", "api-ms-win-crt-runtime-l1-1-0.dll","api-ms-win-crt-stdio-l1-1-0.dll", "api-ms-win-crt-string-l1-1-0.dll","api-ms-win-crt-time-l1-1-0.dll", "api-ms-win-crt-utility-l1-1-0.dll","ucrtbase.dll"};

新增 CheckDll 方法,根据运行环境加载对应的 VC++ 2015 运行时:

private static void CheckDll() // 检查浏览器的DLL是否载入{if (_dllLoaded){return;}var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Environment.Is64BitProcess ? "x64" : "x86");foreach (var fname in DllList){try{var path = Path.Combine(dir, fname);if (File.Exists(path)){LoadLibrary(path);}}catch{}}_dllLoaded = true;}

注意:CheckDll 需要在 Resolver 方法中被调用。完成以上操作后,CefSharp程序就可以在未安装 VC++ 2015 环境的机器上成功运行了:

开源

本文所展示的全部代码和项目工程均在 Gitee 上开源。完整的项目文件和依赖文件可以在以下地址拿到:

https://gitee.com/coderbusy/demo/tree/master/WinForm/CefSharpEmbedCppRunTime

为 CefSharp 应用内置 C++ 运行环境并启用 AnyCPU 支持相关推荐

  1. 在python内置集成开发环境中可使用快捷键什么_2020知道智慧树普通话训练与测试题库及答案...

    [多选题]请问下列作品中,属于高更的艺术作品有哪些? A. B. C. D. [填空题]在 Python 内置集成开发环境 IDLE 中,可使用快捷键 运行当前打开的源代码程序. [多选题]经济环境是 ...

  2. 如何模拟微信内置浏览器阅读环境打开文章

    如何模拟微信内置浏览器阅读环境更换ua打开文章 有时候,我们需要使用电脑浏览器打开微信的文章,却常常碰到这种情况, 那么,如何在没有登录微信的情况下,仅仅使用电脑,模拟微信浏览器访问文章呢,网上大神们 ...

  3. 【DDSCAT——离散偶极近似仿真程序10】DDSCAT内置示例运行结果

    此部分我们整理了DDSCAT 7.3.0 Examples中所有的示例的单波长运行结果,并对vtr文件进行了可视化. 对于所有的示例文件,只有个别的ddscat.par中设定了1 = NRFLD,即进 ...

  4. SpringBoot整合DWR-3.0.2-RELEASE版本,以及解决项目在开发环境及其外置Tomcat运行正常,独立JAR形式内置Tomcat运行异常的问题

    SpringBoot整合DWR 3.0.2-RELEASE填坑日记 填坑背景 问题溯源 填坑步骤 一.示例代码结构 二.示例代码说明 1.框架配置代码编写 2.后端服务代码编写 3.后端服务注册配置 ...

  5. 配置Android Studio内置jre的环境变量

    下载Android Studio时,包括jre.将这个jre配置过环境变量后,就可以在全局使用了.但是和官网安装jre的环境配置略有不同. 图一  jre官网下载,安装后的目录 图二  Android ...

  6. 开发环境和运行环境_内网安全运行环境

    运行环境 硬件环境 建议配置:双 Intel 至强 CPU,主频 2.8G 或以上: 120G 硬盘或以上: 2G 内存或以上: 注意: 所选择的 Windows 服务器须支持冗余/高可用的配置,能够 ...

  7. MAC 使用内置Apache 运行PHP

    背景:MAC 12 之后,就把内置的 PHP去掉了,需要自己安装. 准备:先创建自己的证书,用来给PHP的 libphp.so 文件签名. 步骤一.创建证书 1.打开启动台 -> 其他 -> ...

  8. Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至 ...

  9. DC/DC内置升压芯片-FP5217MR-G1-60W大功率升压芯片支持26V输出

    FP5217是一顆非同步电流模式(CC模式)DC-DC升压转换器,内置15mΩ,8A,30V NMOS, 输入低启动电压2.5V与电压工作范围5V24V,单节锂电池3V4.2V应用,将Vout接到HV ...

最新文章

  1. 交叉熵损失(Cross Entropy Loss)计算过程
  2. linux mysql忘记root密码
  3. 【BLE】TLSR8258开发记录之10--更改MTU为245
  4. Database:Database数据库的简介、类型及其区别(关系数据库VS非关系型数据库)、案例应用之详细攻略
  5. Python with as 用法
  6. MySQL查询缓存总结
  7. 嵌入式系统UBOOT
  8. 数据结构与算法——排序
  9. 金额转换java_java金额转换
  10. linux批量筛选序列变异位点,使用bedtools获取指定坐标上下游的序列
  11. Landsat-8 介绍
  12. 电脑控制所有手机的两种方式
  13. firefox装在linux_linux下安装firefox
  14. 由电脑经常出故障,可见人类星际航行的不可能
  15. 微信不显示王者荣耀连接服务器,王者荣耀省级不显示,王者荣耀不用微信怎么登录...
  16. whitelabel error page SpEL RCE漏洞复现
  17. 【已解决】程序异常终止:Process finished with exit code -1073741819 (0xC0000005)
  18. C++11 文件读写(vs2019 安装配置boost库)
  19. 【000】欢迎来到嵌入式开发教程
  20. 【基于Web停车场管理系统——开题报告 分享(仅供参考呀)】

热门文章

  1. 【渗透过程】嘉缘网站 --测试
  2. [Leetcode Week15]Populating Next Right Pointers in Each Node
  3. Kinect开发笔记之四检测并调试Kinect设备
  4. echo和@echo_如何在Echo Show和Echo Spot上切换到24小时时钟
  5. 网格自适应_ANSYS 非线性自适应(NLAD)网格划分及应用举例
  6. 19.12 添加自定义监控项目 配置邮件告警 测试告警
  7. 翻译:用户变量(User-Defined Variable)(已提交到MariaDB官方手册)
  8. 01:操作系统(centos,redhat):性能监控和网络命令
  9. 记一次TCP连接异常故障解决
  10. CAD数据与ArcGIS数据的互转换(转载)