无法加载文件或程序集“CefSharp.dll”或其某个依赖项

21

我正在尝试使用CefSharp将我的Web应用加载到Winforms中。我已添加了2个dll文件:CefSharp.dll和CefSharp.WinForms作为引用,并通过添加现有项添加了2个dll文件icudt.dll和libcef.dll到我的项目中。
输入图像描述

这是表单的代码:

public WebView web_view;

public Form1()
{
     InitializeComponent();
     web_view = new WebView("http://localhost:8084/wsmill",new CefSharp.BrowserSettings());
     web_view.Dock = DockStyle.Fill;
     toolStripContainer1.ContentPanel.Controls.Add(web_view);
     CefSharp.CEF.Initialize(new Settings());
}

运行应用程序时,我出现了这个错误

发生未处理的类型为 'System.IO.FileLoadException' 的异常, 在 WindowsFormsApplication1.exe 中 附加信息: 无法加载文件或程序集 'CefSharp.dll' 或其某个依赖项。一个动态链接库 (DLL) 初始化例程失败。 (HRESULT 异常:0x8007045A)

希望谁能知道这个问题并帮助我解决,谢谢。


5
安装Visual C++ Redistributable 2012。它应该可以正常工作。 - ARUNRAJ
1
请注意,Norton防病毒软件会尝试隔离cefsharp.dll文件。 - djangofan
2
如ARUNRAJ所说,请安装此程序:https://www.microsoft.com/en-au/download/details.aspx?id=30679 - Scott Warren
12个回答

26

你需要放置这些文件

libcef.dll
icudtl.dat
CefSharp.dll
CefSharp.WinForms.dll

将文件复制到您的bin\Debug目录下(或者根据您的配置放置在bin\Release目录下)。

请务必安装Visual C++ 2012 Redistribution(43版本以后需要安装Visual C++ 2013 Redistributable)。如果您没有安装,即使您已经拥有CefSharp.dll,Visual Studio仍会显示异常提示找不到该文件。


2
至少在我的安装中,第二个文件应该是icudtl.dat,而不是icudt.dll。请注意".dat"之前的"t"后面的"l"。 - Robert Oschler
icudtl.dat 是 Unicode 支持文件,而不是 icudt.dll。 请参阅 https://github.com/cefsharp/CefSharp/wiki/Output-files-description-table-(Redistribution)。 - Tom Wilson

8
这是一个常见的错误,由于输出目录(bin\Debug或bin\Release,取决于您在Visual Studio中运行的配置)中没有所有所需的文件而导致。 CefSharp.dll 是一个基于.NET的DLL,它依赖于其他.dll文件,这些文件又进一步依赖于其他.dll和其他文件。
以下是最低要求文件的清单:
- libcef.dll(核心Chromium DLL,基本上包含Web浏览器+我们所依赖的CEF嵌入接口) - icudt.dll(用于Chromium的Unicode DLL,也必须存在) - CefSharp.dll(包含核心CefSharp功能的托管.NET程序集) - CefSharp.WinForms.dllCefSharp.WPF.dll(取决于您的项目类型)
请参阅CefSharp - 常见问题解答

5
我该如何添加libcef和icudt?我知道它们是win32 dll而不是.net dll,所以我无法像引用一样添加它们。我按照微软的指示进行了操作,但仍然无法成功。请帮我解决这个问题。 - Kien Dang Ngoc

7

我刚遇到了这个问题,我按照以下步骤解决:

CefSharp.DependencyChecker没有报告任何缺失,但是当我调用new CefSharp.Wpf.ChromiumWebBrowser()时,异常发生了。

我使用ILSpy检查了所有的ms.net CEF dll,并发现其中一些DLL也位于GAC中。当我将它们从GAC中移除后,一切都正常了!


谢谢。我已经阅读了所有在线答案,包括常见问题解答,但它们都遗漏了一些依赖项检查器发现的组件。 - user884248

7

这是一个常见问题,因此在FAQ中提到,问题编号为3。

@AcccessDenied是正确的。文件需要存在于您的输出文件夹(bin\Debug或bin\Release)中。一种方法是使用Post-Build操作,在Visual Studio的项目设置下设置。

您还可以在.csproj文件中设置后期构建,类似于以下内容:

<Target Name="AfterBuild">
  <ItemGroup>
    <CefBinaries Include="$(SolutionDir)CEF\$(UnmanagedPlatform)\*.*" />
    <LocaleFiles Include="$(SolutionDir)CEF\locales\*.*" />
    <SubProcessFiles Include="$(SolutionDir)$(UnmanagedPlatform)\$(Configuration)\CefSharp.BrowserSubprocess.exe" />
  </ItemGroup>
  <Copy SourceFiles="@(CefBinaries)" DestinationFolder="$(TargetDir)" />
  <Copy SourceFiles="@(LocaleFiles)" DestinationFolder="$(TargetDir)locales" />
  <Copy SourceFiles="@(SubProcessFiles)" DestinationFolder="$(TargetDir)" />
</Target>

(This example is taken from the CefSharp.Wpf.Example project in the CefSharp source code, CefSharp3 branch. The exact file locations may vary in your case, especially if using CefSharp1, so adapt it as needed to ensure the files get copied correctly.)
我不建议将东西放在bin\Debug或bin\Release中,并使用Copy Always添加到解决方案中。这对我来说感觉很笨拙。

1
这个解决方案比得到最多赞的答案更加简洁,虽然它不匹配 NuGet CefSharp 目录结构,但是它能够给你一个大致的想法。 - Ziul

3

我之前成功运行了离线CEF,但在将解决方案升级到Core 3.1后,CEP突然停止工作。我仍然不确定原因,但是复制资源、VC++运行时库等其他常规解决方案都无效。为诊断目的,在我的启动代码中添加了以下代码,结果CEP又可以工作了。程序集位于同一路径下,但加载它们似乎向程序集绑定器发出信号。如果有人同样感到沮丧,可以尝试类似的方法来处理您使用的任何CEF程序集变体。也许一些.NET大师可以解释为什么这有帮助。

  try
  {
    Assembly asm;
    string path;

    path = Path.Combine(
      Directory.GetCurrentDirectory(),
      "CefSharp.Core.dll");
    asm = Assembly.LoadFrom(path);
    path = Path.Combine(
      Directory.GetCurrentDirectory(),
      "CefSharp.OffScreen.dll");
    asm = Assembly.LoadFrom(path);
  }
  catch (Exception exception)
  {
    System.Diagnostics.Trace.WriteLine(exception.Message + " @ " + exception.StackTrace);
  }

感谢 @amaitland 提供的相关信息,以下是更新说明:

根据https://github.com/cefsharp/CefSharp.MinimalExample#net-core-support的说明,我更新了我的项目,包含如下内容:
<ItemGroup>
  <Reference Update="CefSharp">
    <Private>true</Private>
  </Reference>
  <Reference Update="CefSharp.Core">
    <Private>true</Private>
  </Reference>
  <Reference Update="CefSharp.OffScreen">
    <Private>true</Private>
  </Reference>
</ItemGroup>

现在,它不再需要之前的代码块即可开箱即用。如果有人像我一样遇到困惑,添加privateassets all到PACKAGE引用中并不是同一件事。您还可以展开项目解决方案资源管理器中的“Assemblies”,右键单击CefSharp程序集,并将CopyLocal更改为Yes而非输入这些行。感谢@amaitland。


2
请参考 https://github.com/cefsharp/CefSharp.MinimalExample#net-core-support,具体来说,您需要向项目中添加条目 https://github.com/cefsharp/CefSharp.MinimalExample/blob/master/CefSharp.MinimalExample.OffScreen/CefSharp.MinimalExample.OffScreen.netcore.csproj#L17 - amaitland
@amaitland 谢谢!!!这就解释了。起初我遇到了麻烦,因为通过nuget,它们是项目引用,并设置了privateassets,但没有效果,但添加一个单独的itemgroup,其中private为true就可以了! - Victor Thomas Wilcox Jr.

1
你需要将文件的“复制到输出目录”属性设置为“始终复制”或“仅在更新时复制”。 这会将所有文件复制到输出目录,正如Coder所述。

1
无论我将其更改为始终复制或仅在较新时复制,它仍会抛出错误。 - Kien Dang Ngoc
@KienDangNgoc,你解决了这个问题吗?因为我也遇到了同样的问题。 - anna
直接将这两个文件添加到我的 bin 发布中,并设置“复制到输出”对我很有帮助,谢谢 c_wiz_kid。 - anna

0
推荐的方法似乎是使用NuGet包。即使如此,您仍需要进行一些非直观的更改,但它们都有记录。在新安装包时,会打开一个readme.txt文件,其中包含最常见的问题。
在我的情况下,我缺少了(x64也可用)。
<probing privatePath="x86" />

我的 App.config 看起来像这样(其中包含 CommonServiceLocator,如果你没有它,请忽略这部分)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="x86" />

      <dependentAssembly>
        <assemblyIdentity name="CommonServiceLocator" publicKeyToken="489b6accfaf20ef0" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.3.0" newVersion="2.0.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

错误是因为在将项目设置为 AnyCPU 时,bin 文件夹中实际上没有 Cefsharp DLL。但是,在您添加此行时探测到的 x86 和 x64 文件夹下存在该 DLL。一个临时的解决方法是将 /bin/x86 的内容复制到 /bin 中。
如果需要 AnyCpu,请将 CefSharpAnyCpuSupport 添加到 csproj 文件中。还需要设置 Prefer 32bit 的项目标志。

只有在选择 AnyCpu 时,文件才会被复制到 x86 和 x64 子文件夹中,如果您选择 x86 或 x64 作为解决方案目标,则文件将直接复制到 bin 文件夹中。如您所建议的设置探测 privatePath 在 x64 上会崩溃,除非您的可执行文件设置为优先使用 32 位。 - amaitland
请注意,您必须在解决方案级别上设置x86 / x64以使用该方法,仅更改个人项目不起作用。请参见https://github.com/cefsharp/CefSharp.MinimalExample以获取一个工作示例。 - amaitland
感谢您的回复。我更新了我的问题,提到了x64和选择AnyCPU的原因。 - CodingYourLife

0

我一直在尝试更改.config文件,不知道是否引起了问题或其他原因。

我删除了本地文件夹,并重新从TFVS ADO存储库获取,重新构建所有内容,生成错误停止。

这可能适用于读者,具体取决于存储库和情况,但并不总是有效。

注意:在删除本地文件夹之前,请制作.zip或复制文件以防存储库出现问题。


0
在我的案例中,我按照CefSharp - Our Code World中指定的步骤进行操作。
与其按照步骤A中添加CefSharpAnyCpuSupportcsprojApp.configprobing,简单设置步骤B中的平台目标x86就可以解决问题了。

0

enter image description here

我发现项目平台中提到了x64。我将其更改为“任何CPU”,它可以正常工作。

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