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

时间:2013-08-13 07:28:10

标签: c# winforms cefsharp

我正在尝试使用CefSharp将我的网络应用加载到winfoms中。我添加了2个dll文件:CefSharp.dll和CefSharp.WinForms到引用中,并通过添加现有项目将2个dll文件icudt.dll和libcef.dll添加到我的项目中。
enter image description here

这是表单中的代码

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)

所以任何了解这一点的人都请帮助我,谢谢

11 个答案:

答案 0 :(得分:23)

您需要放置这些文件

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

进入 bin \ Debug (或 bin \ Release 基于您的配置)

请不要忘记安装 Visual C ++ 2012 Redistribution (Visual C ++ 2013 Redistributable自版本43以来),如果您不这样做,Visual Studio将始终显示异常告诉你没有找到CefSharp.dll,尽管你已经拥有它了!

希望得到这个帮助。

答案 1 :(得分:6)

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

@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源代码中的CefSharp.Wpf.Example项目CefSharp3分支。确切的文件位置可能因您的情况而异,尤其是在使用CefSharp1时,请根据需要进行调整以确保文件获得正确复制。)

我不建议将内容放入bin \ Debug或bin \ Release中,并使用Copy Always将其添加到解决方案中。这对我来说感觉像是一块垃圾。

答案 2 :(得分:6)

我刚刚遇到了这个问题,我做了以下事情:

CefSharp.DependencyChecker没有报告丢失的内容,但是一旦我发出新的CefSharp.Wpf.ChromiumWebBrowser()异常,就会报告错误。

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

答案 3 :(得分:5)

这是一个常见错误,原因是输出目录中不存在所有文件(bin \ Debug或bin \ Release,具体取决于您在Visual Studio中运行的配置)。 CefSharp.dll是一个基于.NET的DLL,依赖于其他.dll文件,而这些文件又依赖于其他.dll和其他文件...

  

以下是所需最低文件的列表:

  • libcef.dll (核心Chromium DLL,基本上包含网络 浏览器+我们依赖的CEF嵌入式界面)
  • icudt.dll (Chromium的Unicode DLL也必须存在)
  • CefSharp.dll (包含核心CefSharp的托管.NET程序集 功能)
  • CefSharp.WinForms.dll CefSharp.WPF.dll (取决于您的项目) 型)

Check this link for more details

答案 4 :(得分:2)

我的离线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提供了相关信息之后,下面的更新,谢谢! 根据{{​​3}},我更新了项目,以包括:

<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>

,它不再需要前一个代码块即可使用。如果有人像我一样陷入混乱,那么将全部私有资产添加到PACKAGE引用中就不是同一回事了。除了在这些行中键入内容之外,您还可以在解决方案资源管理器中为您的项目展开“ Assemblies”,然后右键单击该处的CefSharp程序集并将CopyLocal更改为Yes。再次感谢,@ amaitland

答案 5 :(得分:1)

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

答案 6 :(得分:0)

就我而言,我正在遵循CefSharp - Our Code World中概述的步骤。

与其在步骤A中将CefSharpAnyCpuSupport中的csprojprobing中的App.config添加到步骤Platform Target B做到了。

答案 7 :(得分: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文件中。需要设置项目“首选32位标志”。

答案 8 :(得分:0)

  1. 确保将所有依赖库都复制到debug / release文件夹中
  2. 如果您自己构建CEFSharp库,请确保构建配置匹配。也就是说,如果您在x86的Release模式下构建应用程序,那么您还必须在x86的Release中构建CEFSharp库。否则它将抛出dll not found错误

答案 9 :(得分:0)

enter image description here

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

答案 10 :(得分:-1)

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