Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法加载文件或程序集';CefSharp.dll';或者它的一个依赖项_C#_Winforms_Cefsharp - Fatal编程技术网

C# 无法加载文件或程序集';CefSharp.dll';或者它的一个依赖项

C# 无法加载文件或程序集';CefSharp.dll';或者它的一个依赖项,c#,winforms,cefsharp,C#,Winforms,Cefsharp,我正在尝试使用CefSharp将我的web应用加载到winfoms中。我在引用中添加了两个dll文件:CefSharp.dll和CefSharp.WinForms,并通过添加现有项将两个dll文件icudt.dll和libcef.dll添加到我的项目中。 这是表格中的代码 运行应用程序时,我遇到了此错误 发生“System.IO.FileLoadException”类型的未处理异常 在WindowsFormsApplication1.exe中 其他信息:无法加载文件或程序集“CefSharp

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

这是表格中的代码

运行应用程序时,我遇到了此错误

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


因此,任何知道这一点的人请帮助我,谢谢这是一个常见错误,它是由于输出目录中没有所有必需的文件(bin\Debug或bin\Release,具体取决于您在Visual Studio中运行的配置)而导致的
CefSharp.dll
是一个基于.NET的dll,它依赖于其他.dll文件,而其他.dll文件又进一步依赖于其他.dll和其他文件

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

  • libcef.dll(核心Chromium dll,基本上包含web 浏览器+我们所依赖的CEF可嵌入性接口)
  • icudt.dll(铬的Unicode dll也必须存在)
  • CefSharp.dll(包含核心CefSharp的托管.NET程序集 功能)
  • CefSharp.WinForms.dllCefSharp.WPF.dll(取决于您的项目 (类型)

请参阅。

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

这是一个常见问题,因此在问题3中提到

@拒绝访问是正确的。文件需要存在于输出文件夹(bin\Debug或bin\Release)中。一种方法是使用
Post-Build
操作,该操作可以在VisualStudio的项目设置下设置

您还可以在
.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分支中的项目。具体文件位置可能因您的情况而有所不同,尤其是在使用CefSharp1时,因此根据需要进行调整,以确保正确复制文件。)


我不建议将内容放在bin\Debug或bin\Release中,然后使用
Copy Always
将其添加到解决方案中。这对我来说就像是一个难题。

你需要把这些文件放进去

libcef.dll
icudtl.dat
CefSharp.dll
CefSharp.WinForms.dll
进入bin\Debug(或bin\Release,取决于您的配置)


<>请不要忘记安装<强> Visual C++ 2012重新分配<强>(VisualC++ +强> 2013 < /强>可重分发版本43)。如果您没有,Visual Studio将始终显示一个异常,说明找不到CefSharp.dll,即使您已经找到了它。

我刚才也遇到了这个问题,我执行了以下操作:

  • 检查所有文件是否都在应用程序根目录中(和)
  • 确保安装了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中移除后,一切正常

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

就我而言,我是按照中概述的步骤进行操作的


与遵循步骤A并在
csproj
中添加
CefSharpAnyCpuSupport
App.config
中添加
probling
不同,只需在步骤B中将
平台目标设置为
x86
,即可达到目的。

推荐的方法似乎是使用NuGet软件包。即使这样,您也需要进行一些非直观的更改,但这些更改是有文档记录的。新安装软件包时,会打开一个带有最常见问题的readme.txt文件

就我而言,我失踪了(也有x64)


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


发生此错误的原因是,当您将项目设置为AnyCPU时,bin文件夹中实际上没有DLL。但是在下面的x86和x64文件夹中,当添加这一行时,您将在其中探测DLL。临时修复方法是将内容从/bin/x86复制到/bin


如果需要AnyCpu,则需要将AnyCpu支持添加到csproj文件中。需要设置首选32位的项目标志。

我让离线CEF工作得很好,然后在将解决方案升级到core 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提供相关信息后,更新如下,谢谢! 根据,我更新了我的项目,包括:

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

真的
真的
真的
而且它不再需要以前的代码块就可以开箱即用。如果
<?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>
  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);
  }
<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>