无法加载文件或程序集“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.dll 或 CefSharp.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