如何包含 CEFSharp 所需的 VC++ 可再发行文件

Posted

技术标签:

【中文标题】如何包含 CEFSharp 所需的 VC++ 可再发行文件【英文标题】:How to include VC++ Redistributable Files Needed by CEFSharp 【发布时间】:2019-07-12 07:39:37 【问题描述】:

使用 CEFSharp 浏览器构建应用程序,在我的机器上运行良好,但在服务器上崩溃并出现以下错误:

System.IO.FileLoadException:无法加载由“CefSharp.Core.dll”导入的过程。

我在整个互联网上都看到过这个问题,最常见的解决方案似乎是安装 VC++ Redistributable。但是,我在我们的生产服务器上没有该访问权限。在开发服务器中,我尝试安装可重新分发的(x86、x64、2017 和 2013),但没有任何区别。电脑是 64 位的,但应用程序是 32 位的,所以我什么都试过了。

谁能告诉我需要将哪些文件添加到应用程序目录中才能使 CEFSharp 正常工作。本文档的第 6 节:https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#6-how-do-i-include-the-visual-studio-c-2012-redistributables-on-the-target-app 列出了必要的文件目录,但我使用的是 Visual Studio 2017,并且我的机器上没有这些目录。

附加信息:

开发机Windows 10,服务器2016 Standard

构建设置为 x86,未对任何 CPU 模式进行任何配置更改

Windows 窗体应用程序

来自 NuGet 的 CefSharp 版本 71.0.0(以及单独通过包管理控制台 Simple CefSharp application is missing files at runtime)

不使用任何类型的包或 ClickOnce 部署,手动 将所有文件从我的计算机上传到服务器

更新:

虽然我仍然无法让 CEFSharp 在我的项目中工作,但我接受了 Peter Liapin 的回答,因为它确实回答了我提出的问题。现在我知道将 VC++ Redistributable 中的哪些文件复制到服务器上的应用程序文件夹中,我只是在我的计算机或服务器上没有他提到的特定 dll。

此外,我使用 CEFSharp 创建了一个新的测试 Windows 窗体项目,它可以在没有 VC++ Redistributable dll 的服务器上运行。但是,我需要 CEFSharp 浏览器在现有应用程序引用的用户控件中工作。

【问题讨论】:

见blogs.msdn.microsoft.com/vcblog/2015/03/03/… 【参考方案1】:

您需要随基于 CefSharp 的项目一起提供的 Visual C++ dll:

如果您使用 CefSharp v63.0.3 或以下版本:

msvcp120.dll msvcr120.dll

如果您使用 CefSharp v65.0.0 或更高版本:

#Example of files for VC++ 2017(141), there will be a few less files for VC++2015(140) and a few more for VC++ 2019(142), copy everything from the `Microsoft.VC14x.CRT` folder where `x` matches the VC++ Version
concrt140.dll
msvcp140.dll
msvcp140_1.dll
msvcp140_2.dll
vccorlib140.dll
vcruntime140.dll

文件可以在您的开发 PC 上的以下位置找到:

C:\Windows\System32 C:\Program Files (x86)\Microsoft Visual Studio\[Version]\[Edition]\VC\Redist\MSVC\[Version]\[x64|x86]\Microsoft.VC14x.CRT 文件夹。 如果您在查找计算机上的文件时遇到问题,请参阅底部部分,VS2015VS2017/2019 相比,它们的文件夹结构略有不同

注意,您的 PC 上必须安装适当版本的 Visual C++ 或 Visual Studio,否则您将无法找到它们:

使用C++ Redistributable for Visual Studio 2013安装版本120

使用Visual C++ Redistributable for Visual Studio 2015安装版本140

版本 141 安装有Microsoft Visual C++ Redistributable for Visual Studio 2017

通用 CRTVisual C++ 所需的,Windows 10 默认安装。支持Universal CRT 的本地部署参见https://docs.microsoft.com/en-us/cpp/windows/universal-crt-deployment?view=vs-2019#local-deployment

对于 Windows 7/8/8.1,您需要预先安装 Universal CRT 或按照上面的链接部署文件。

要部署可再发行的 Visual C++ 文件,您可以使用 Visual C++ 可再发行包(VCRedist_x86.exe、VCRedist_x64.exe 或 VCRedist_arm.exe) 包含在 Visual Studio 中。在 Visual Studio 中 2017,这些文件可以在 Program Files[(x86)]\Microsoft 中找到 Visual Studio\2017\edition\VC\Redist\MSVC\lib-version 文件夹,其中 edition 是安装的 Visual Studio 版本,lib-version 是 要重新分发的库版本。在 Visual Studio 2015 中,这些 文件可以在 Visual Studio 安装目录下找到 程序文件 [(x86)]\Microsoft Visual Studio 版本\VC\redist\语言环境。另一种选择是使用可再发行 合并模块(.msm 文件),在 Visual Studio 2017 中可以找到 在程序文件 [(x86)]\Microsoft Visual Studio\2017\edition\VC\Redist\MSVC\lib-version\MergeModules\ 文件夹。 在 Visual Studio 2015 中,这些可以在 Program Files 中找到 [(x86)]\通用文件\合并模块。也可以直接 在本地应用程序中安装可再发行的 Visual C++ DLL 文件夹,这是包含您的可执行应用程序的文件夹 文件。出于维修原因,我们不建议您使用此 安装位置。

根据https://docs.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files?view=vs-2019,VS2015 的位置与VS2017/2019 略有不同。

【讨论】:

你需要包含 140 或 141 的 dll。120 是 2013 版本。微软对 2015 及更高版本做了一些简化和复杂的事情,我建议大家阅读blogs.msdn.microsoft.com/vcblog/2015/03/03/… github.com/cefsharp/CefSharp#release-branches 根据分支列出 CefSharp 的 .net 版本和 vc++ 版本要求 感谢您的澄清。我们仍然使用 ChefSharp 版本 49.0.0,因为由于一些重大更改以及与客户的某些要求不兼容,我们还无法迁移到较新的版本。我不知道 Visual C++ 版本有变化。有用的注意事项!我已经更新了我的答案。 不幸的是,在我的计算机中,CEFSharp 工作,我没有 msvcp141.dll 或 msvcr141.dll。我确实有 msvcp120.dll 和 msvcr120.dll,这些文件也在服务器上。我将尝试降级应用程序中使用的 CEFSharp 版本。希望 63 版仍然具有所有必要的功能:javascript 和 C# 代码之间的通信以及静默文件下载。 您确定在您的开发 PC 上安装了 Visual Studio C++ Redistributable 2015:microsoft.com/en-us/download/details.aspx?id=48145 吗?【参考方案2】:

我遇到了似乎完全相同的问题,我能够通过将 msvcp140.dll 和 vcruntime140.dll 复制到我的应用程序的 bin 文件夹中来使事情正常进行。我正在使用 CEFSharp 75.1.143 和 cef.redist.x86 75.1.14。

【讨论】:

谢谢,你救了我的命,我找不到文件 msvcr140.dll,但改用了 vcruntime140.dll,为我工作。

以上是关于如何包含 CEFSharp 所需的 VC++ 可再发行文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Windows 安装程序的情况下安装 vc++ 可再发行组件

如何在安装 WiX Bundle 时避免卸载以前安装的 ExePackage(可再发行文件)?

Swift:尽管我调用了所需的代码,但导航栏却隐藏了?

VC_可再发行组件包

如何使 windeployqt 仅包含所需的模块?

选择哪个 VC++ 可再发行包(x86 或 x64)?