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

Posted

技术标签:

【中文标题】无法加载文件或程序集“CefSharp.dll”或其依赖项之一【英文标题】:Could not load file or assembly 'CefSharp.dll' or one of its dependencies 【发布时间】:2013-08-14 17:08:21 【问题描述】:

我正在尝试使用 CefSharp 将我的网络应用程序加载到 winfoms 中。我已将 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 附加信息:。一个动态链接库 (DLL) 初始化例程失败。 (HRESULT 的例外情况: 0x8007045A)

所以知道的人请帮帮我,谢谢

【问题讨论】:

安装 Visual C++ Redistributable 2012。它应该可以工作。 仅供参考,Norton Antivirus 将尝试隔离 cefsharp.dll 。 正如 ARUNRAJ 所说安装这个:microsoft.com/en-au/download/details.aspx?id=30679 【参考方案1】:

我发现其中一个项目平台被称为 x64。我将其更改为“任何 CPU”,它工作正常。

【讨论】:

【参考方案2】:

这是一个常见错误,由于输出目录中没有所有必需的文件(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 - Frequently asked questions。

【讨论】:

那么如何添加 libcef 和 icudt,我知道它是 win32 dll 而不是 .net dll,所以我不能像参考一样添加它,按照微软的说明,我确实像上面一样,但它没有用。【参考方案3】:

你需要把这些文件放进去

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

进入您的 bin\Debug(或 bin\Release,取决于您的配置)。

请不要忘记安装 Visual C++ 2012 Redistribution(Visual C++ 2013 自版本 43 起可再发行)。如果您不这样做,Visual Studio 将始终显示一个异常,指出未找到 CefSharp.dll,即使您已经拥有它。

【讨论】:

至少在我的安装中,第二个文件应该是 icudtl.dat,而不是 icudt.dll。请注意“.dat”之前的“t”之后的“l”。 icudtl.dat 是 Unicode 支持文件而不是 icudt.dll 见github.com/cefsharp/CefSharp/wiki/…【参考方案4】:
    确保将所有依赖库复制到调试/发布文件夹 如果您自己构建 CEFSharp 库,请确保构建配置匹配。也就是说,如果您在 x86 发布模式下构建应用程序,那么您还必须在 x86 发布模式中构建 CEFSharp 库。否则会抛出 dll not found 错误

【讨论】:

【参考方案5】:

我的离线 CEF 工作正常,但在将解决方案升级到核心 3.1 后它突然停止工作。仍然不知道为什么,但是复制资源、VC++ 运行时等以及其他常见的解决方案都不起作用。我在启动代码中添加了以下代码用于诊断目的,突然间,CEF 再次工作。程序集在同一路径中,但似乎将它们加载到程序集活页夹中。如果有人同样感到沮丧,可以尝试使用您正在使用的任何 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 引用中并不是一回事。除了输入这些行之外,您还可以在解决方案资源管理器中为您的项目展开“程序集”,然后右键单击那里的 CefSharp 程序集并将 CopyLocal 更改为 Yes。再次感谢@amaitland

【讨论】:

见github.com/cefsharp/CefSharp.MinimalExample#net-core-support具体你需要添加条目到你的项目github.com/cefsharp/CefSharp.MinimalExample/blob/master/… @amaitland 谢谢!!!这就解释了。起初我遇到了麻烦,因为通过 nuget 项目引用和设置 privateassets 都没有任何效果,但是添加单独的 itemgroup 和 private true 作品!【参考方案6】:

推荐的方法似乎是使用 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 文件夹中。除非您的可执行文件设置为首选 32 位,否则按照您在 x64 上的建议设置探测 privatePath 将崩溃。 请注意,您必须在解决方案级别设置 x86/x64 才能使用该方法,仅针对您的单个项目进行更改是行不通的。有关工作示例,请参阅 github.com/cefsharp/CefSharp.MinimalExample 感谢您的意见。我更新了我的问题以提及 x64 以及选择 AnyCPU 的原因【参考方案7】:

就我而言,我按照CefSharp - Our Code World 中概述的步骤进行操作。

无需按照步骤 A 并在 csproj 中添加 CefSharpAnyCpuSupport 和在 App.config 中添加 probing,只需在步骤 B 中将 Platform Target 设置为 x86 即可。

【讨论】:

【参考方案8】:

将“msvcp120.dll”和“msvcr120.dll”设置为“始终复制”对我有帮助。

【讨论】:

【参考方案9】:

我也遇到了这个问题,我做了以下操作:

检查所有文件是否在应用根目录中(https://github.com/cefsharp/CefSharp/wiki/Output-files-description-table-%28Redistribution%29 和 https://bitbucket.org/chromiumembedded/cef/src/aefb5ccce879f308f0bcc3ac719c86defe2f9715/tools/distrib/win/README.redistrib.txt?at=master&fileviewer=file-view-default) 确保安装了 C++ Redist(实际上我安装了 2010、2013、2015 所有 x86 和 x64)

在启动过程中添加了以下代码以确保所有依赖项都存在

    string dir = AppDomain.CurrentDomain.BaseDirectory;
    var missingDeps = CefSharp.DependencyChecker.CheckDependencies(true, false, dir, string.Empty,
        Path.Combine(dir, "CefSharp.BrowserSubprocess.exe"));
    if (missingDeps?.Count > 0)
        throw new InvalidOperationException("Missing components:\r\n  " + string.Join("\r\n  ", missingDeps));
    // ReSharper disable once UnusedVariable
    var browser = new CefSharp.Wpf.ChromiumWebBrowser(); //test, if browser can be instantiated

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

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

【讨论】:

谢谢。我一直在在线阅读所有答案,包括常见问题解答,他们都遗漏了 DependencyChecker 找到的几个组件。【参考方案10】:

这是一个常见问题,因此在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>

(此示例取自 CefSharp 源代码 CefSharp3 分支中的 CefSharp.Wpf.Example 项目。具体文件位置可能因您的情况而异,尤其是在使用 CefSharp1 时,因此请根据需要进行调整以确保正确复制文件.)

我不建议将东西放入 bin\Debug 或 bin\Release 并使用 Copy Always 将其添加到解决方案中。对我来说,这就像一个杂物。

【讨论】:

此解决方案比最受好评的答案更简洁,它与 NuGet CefSharp 目录结构不匹配,但它为您提供了总体思路。【参考方案11】:

您必须将文件的“复制到输出”属性设置为“始终复制”或“如果更新则复制”。 如 Coder 所述,这会将所有文件复制到输出目录。

【讨论】:

无论我将其更改为始终复制还是更新时复制,它仍然会引发错误 @KienDangNgoc 你是否解决了这个问题,因为我面临同样的问题 实际上将这两个直接添加到我的 bin 版本中并设置“复制到输出”对我有用,谢谢 c_wiz_kid

以上是关于无法加载文件或程序集“CefSharp.dll”或其依赖项之一的主要内容,如果未能解决你的问题,请参考以下文章

能加载文件或程序集“Aspose.Cells”或它的某一个依赖项。无法验证强名称签名

无法加载文件或程序集,但已加载

无法加载文件或程序集 'PayPalAdaptivePaymentsSDK,版本 = 2.12.117.0

无法加载文件或程序集'netstandard,版本 = 2.0.0.0

无法加载文件或程序集。找到的程序集的清单定义与程序集引用不匹配

无法加载文件或程序集 此处的程序集名称 或其依赖项之一。访问被拒绝