C# 无法加载文件或程序集';CefSharp.dll';或者它的一个依赖项
我正在尝试使用CefSharp将我的web应用加载到winfoms中。我在引用中添加了两个dll文件:CefSharp.dll和CefSharp.WinForms,并通过添加现有项将两个dll文件icudt.dll和libcef.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
这是表格中的代码
运行应用程序时,我遇到了此错误 发生“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.dll或CefSharp.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,即使您已经找到了它。我刚才也遇到了这个问题,我执行了以下操作:
- 检查所有文件是否都在应用程序根目录中(和)
- 在启动期间添加了以下代码,以确保所有依赖项都存在
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
没有报告任何丢失的内容,但在我调用newCefSharp.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>