我正在尝试使用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中 附加信息:无法加载文件或程序集“CefSharp.dll”或其依赖项之一。动态链接库 (DLL)初始化例程失败。 (HRESULT的例外情况: 0x8007045A)
所以任何了解这一点的人都请帮助我,谢谢
答案 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)
我刚刚遇到了这个问题,我做了以下事情:
在启动期间添加了以下代码,以确保所有依赖项都在那里
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
没有报告丢失的内容,但是一旦我发出新的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和其他文件...
以下是所需最低文件的列表:
答案 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
中的csproj
和probing
中的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)
答案 9 :(得分:0)
答案 10 :(得分:-1)
将“msvcp120.dll”和“msvcr120.dll”设置为“始终复制”对我有帮助。