CefSharp - 无法加载文件或程序集'CefSharp.Core.dll'或其某个依赖项

22
我已经在开发一个CefSharp WinForms应用程序几周了,一直没有遇到任何问题。今天早上,在添加一些东西到应用程序时,我尝试运行它以测试一些内容,结果出现以下错误:
System.IO.FileNotFoundException was unhandled Message: An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll Additional information: Could not load file or assembly 'CefSharp.Core.dll' or one of its dependencies. The specified module could not be found.
搜索了一会儿后,我找到了这个:

https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#Runtime_dependencies

我检查了项目的bin/Debug/x86文件夹,所有依赖项似乎都存在。更重要的是,在五分钟之前它一直正常工作,除了一个Entity Framework迁移的单个类,我没有碰过任何东西。
我尝试过清理和重新构建解决方案,重启Visual Studio,重启我的电脑以及清空/bin/Debug文件夹,但这些都没有帮助。
为什么这个错误现在会出现,而且几天前却没有出现呢?我该如何解决这个问题?
编辑:我进行了一些进一步的实验,我能够使应用程序在Release模式下运行,但不能在Debug模式下运行。如果我将Release模式的输出路径更改为Debug,它会失败并显示相同的错误(同样,使用Release输出路径时Debug模式成功)。
6个回答

21

首先,请确保您已安装了Microsoft Visual C++ Redistributable:

  • 版本v93及以上:使用Microsoft Visual C++ 2019 Redistributable或更高版本
  • 版本v65-v92:使用Microsoft Visual C++ 2015 Redistributable或更高版本
  • 旧版本:使用Microsoft Visual C++ 2013 Redistributable(确切版本)

您可以从Microsoft下载Visual C++ Redistributable。有关版本兼容性的更多详细信息,请参见C++ binary compatibility between Visual Studio versions

请确保匹配正确的架构,如果您的应用程序是x64,则需要安装Visual C++ Redistributable的x64版本。同样,如果您的应用程序是x86,则需要安装Visual C++ Redistributable的x86版本。

Microsoft Visual C++ Redistributable依赖于通用CRT。通用CRT作为Windows 10/11的一部分包含在内。在旧版本的Windows上,Visual C++ Redistributable将安装通用CRT
对于那些希望将Visual C++ Runtime与其应用程序一起使用的人,技术上可以将运行时库与您的应用程序一起包含。另请参阅Microsoft的Visual C++中的部署文章的本地部署部分。

2
如果您安装了正确的 VCRedist,那么您不需要与 Universal CRT 相关的任何内容。请阅读 https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/ 中的 Distributing Software that uses the Universal CRT 部分。 - amaitland
1
VC++ 2015 Redist 安装修复了我的问题。 - JsAndDotNet

11

在安装了以下的可再发行组件后,我解决了同样的问题: Microsoft Visual C++ Redistributable


2
我曾经遇到过这个错误,当客户端安装了_Microsft Visual C++ 2015 Redistributable (x86)_。卸载_Microsft Visual C++ 2015 Redistributable (x86)_,然后安装Microsft Visual C++ 2015-2019 Redistributable (x86) - 14.28.29325版本,解决了类似于主题的错误,如下所示的异常:System.BadImageFormatException: Failed to load the file 'CefSharp.Core.dll' or its integrated code or one of its dependencies. is not a valid Win32 application. (HRESULT returned exception: 0x800700C1) - LysanderM
1
@LysanderM 是的,我也遇到了这个问题,问题是那个版本不太容易找到 :( - DanielV
1
是的,这两周真是噩梦。感谢提供信息。 - LysanderM
完全理解,这让我痛哭流涕。 - DanielV

8
SuperBerry的VC++ redistribution package安装解决了我的问题。我会从我的幼稚角度提供一些故障排除见解。
错误信息非常清楚,要么是缺少CefSharp.Core.dll组件,要么是它的某个依赖项。所以问题归结为如何找出缺失的内容?
首先,您是否有CefSharp.Core.dll?在Solution Explorer中查看出现此问题的项目的引用。您应该能够找到对CefSharp.Core的引用。如果找不到,则缺少该组件。如果有一个,则问题在于缺少其所需的依赖项。当您单击CefSharp.Core引用时,在详细信息中,您将获得其所在位置的完整路径。在我的情况下,它位于“C:\Users\tom\source\repos\MyProject\src\packages\CefSharp.Common.41.0.0\CefSharp\x86\CefSharp.Core.dll”。
您需要获取CefSharp.Core依赖项列表,以确定缺少的依赖项。Dumpbin.exe是一个命令行工具,可用于获取依赖项列表。为了使用dumpbin,您需要确保它可以在系统环境变量的路径中找到。我在VC工具bin目录的路径上找到了它。在我的情况下,我在以下位置找到了它:'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64'。打开命令提示符终端并导航到包含CefSharp.Core.dll的文件夹,然后输入以下内容:
 >dumpbin /dependents CefSharp.Core.dll

我得到的结果是:
 Dump of file CefSharp.Core.dll

 File Type: DLL

   Image has the following dependencies:

KERNEL32.dll
MSVCP110.dll
MSVCR110.dll
libcef.dll
USER32.dll
mscoree.dll

多年没有使用Microsoft Visual Studio,我必须尝试找出那些依赖项应该放在哪里,以便它们可以被解决。 我只需进行互联网搜索,例如“Kernel32.dll位于何处”,然后针对每个dll执行此操作,直到找到缺失的dll。 在我的情况下,我找不到MSVCR110.dll,所以我强烈怀疑这是我的问题。 然后我在互联网上搜索“MSVCR110.dll丢失”,发现它是vc ++重新分配的一部分。(SuperBerry,在您的第一个观点上是正确的)。 我还发现它可以从以下链接下载:'https://www.microsoft.com/en-us/download/details.aspx?id=30679'。 我下载了x86和x64版本(尽管我只需要x86版本用于此项目)。 它们是可执行文件,运行时会安装它们。 安装后,我在'C:\ Windows \ SysWOW64'和'C:/ Windows / System32'中找到了它们的副本。 这个问题就解决了。
我从这个过程中学到的是,很难知道你是否安装了正确的VC++分发包。我以为当启用VC++功能时,Visual Studio安装后会自动安装它。我使用的是Visual Studio Community 2019版本。我正在处理的项目是我从GitHub源代码克隆的。我仍然对VC++分发版本控制感到困惑。例如,我是否可以安装一些更新的版本并且它能够正常工作(即向后兼容)?

1
请参阅https://learn.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2019。通常最好提出一个新问题,而不是在回答中提问。 - amaitland
1
那份文件对我理解正在进行的事情很有帮助。我克隆了一个针对 .netframework 4.0 的 GitHub 项目。当我克隆该项目时,可能会提供让我针对更高版本的机会,但我认为只需将其保留在原来的版本上会更容易。通过针对版本 4.0,这就使得该项目依赖于 vc++ redistributable VS 2012,而我没有安装它。如果我让该项目迁移到当前的 .framework,由于我已经安装了当前的 vc++ redist,这个问题就不会发生了。 - Tom Rutchik
1
CefSharp版本决定了所需的vc++版本。您克隆的项目正在使用5年前的版本。请参阅https://github.com/cefsharp/CefSharp/releases和https://github.com/cefsharp/CefSharp#release-branches。 - amaitland
https://github.com/cefsharp/CefSharp.MinimalExample 始终保持最新状态,可用于测试最新版本。 - amaitland
谢谢amaitland,你是对的。我从来没有看过CefSharp是什么。我以为它是在创建项目时自动添加的引用,并且基于这个错误的假设,我认为它被添加是因为它是一个.net framework 4.0项目(错了!)。我以为它是一些c#支持库,但它实际上是一个嵌入式chromium框架。当我搞错事情时,我总觉得自己像个白痴,但我很感激你的时间和努力。这有助于我提高水平。再次感谢! - Tom Rutchik

5

我遇到了同样的问题,解决的方法是添加

    <CefSharpBuildAction>Content</CefSharpBuildAction>

转到您正在处理的项目的csproj内的第一个PropertyGroup。


这个添加使我发布的应用程序版本工作了,但它也将我的应用程序大小从13.0MB增加到了203.0MB。 - John Kurtz
随着您的应用程序现在包含了“Chromium嵌入式框架”,因此大小增加是预期的。 - amaitland

3
我在发布模式下也遇到了同样的问题。通过查看GitHub CefSharp FAQs注意2解决了我的问题。

如果从源代码编译(不推荐,使用Nuget包),并且您注意到您无法再调试模式下构建,但是发布版本可以正常工作,则可能需要修复您的Visual Studio版本。这种情况很少发生,您会收到与上述缺失未管理的.dll文件完全相同的消息。

我不得不修复Visual Studio,然后一切都恢复正常了。

3
这个页面和投票数量证明它并不是那么罕见。 - itsho

1

对于未来的我,当我在 Visual Studio 中启动我的 .net core 3.1 wpf 应用程序时,每次都会遇到以下错误 -> 无法加载文件或程序集 'CefSharp.Core.Runtime。'

这浪费了我几个小时的时间!

我的解决方案:不要在 WinForm 或 WPF 窗口类中初始化 Cef。您需要在启动的主应用程序中进行初始化。例如,在我的示例中,我需要添加以下内容:

public App()
{
   CefSettings _browserSettings = new CefSettings();
   ...
   Cef.Initialize(_browserSettings);
}

如果您准备创建一个最小化的示例来重现问题,请开始讨论,以确定是否可以改进。https://github.com/cefsharp/CefSharp/discussions - amaitland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接