可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to use CefSharp to load my web app into winfoms. I've added 2 dll files: CefSharp.dll and CefSharp.WinForms into references and add 2 dll files icudt.dll and libcef.dll into my project through add existing items.
and this is the code from the form
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());
}
When run the app, I got this error
An unhandled exception of type 'System.IO.FileLoadException' occurred
in WindowsFormsApplication1.exe
Additional information: Could not load file or assembly 'CefSharp.dll' or one of its dependencies. A dynamic link library
(DLL) initialization routine failed. (Exception from HRESULT:
0x8007045A)
So anyone who know about this please help me, thanks
回答1:
You need to put these files
libcef.dll
icudtl.dat
CefSharp.dll
CefSharp.WinForms.dll
into your bin\Debug (or bin\Release base on your configuration)
And please do not forget to install Visual C++ 2012 Redistribution ( Visual C++ 2013 Redistributable since version 43), if you don't Visual Studio will always display an exception tell not found CefSharp.dll although you already have it!
Hope this help.
回答2:
This is a common problem and is therefore mentioned in the FAQ, question number 3.
@AcccessDenied is right. The files need to be present in your output folder (bin\Debug or bin\Release). One way to make this is by using a Post-Build
action, which can set under the project settings in Visual Studio.
You can also set up the post-build in the .csproj
file, somewhat like this:
<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>
(This example is taken from the CefSharp.Wpf.Example project in the CefSharp source code, CefSharp3 branch. The exact file locations may vary in your case, especially if using CefSharp1, so adapt it as needed to ensure the files get copied correctly.)
I don't recommend putting stuff in bin\Debug or bin\Release and adding it to the solution using Copy Always
. It feels like a kludge to me.
回答3:
I have just had problems with this as well and I did the following:
- check that all files are in the apps root directory (https://github.com/cefsharp/CefSharp/wiki/Output-files-description-table-%28Redistribution%29 and https://bitbucket.org/chromiumembedded/cef/src/aefb5ccce879f308f0bcc3ac719c86defe2f9715/tools/distrib/win/README.redistrib.txt?at=master&fileviewer=file-view-default)
- made sure the C++ Redist was installed (in fact I have 2010, 2013, 2015 all x86 and x64 installed)
added the following code during startup to ensure all dependencies are there
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
did not report anything missing but as soon as I called new CefSharp.Wpf.ChromiumWebBrowser()
the exception occured.
I checked all ms.net CEF dlls using ILSpy and found that some of these DLLs were also located in the GAC. As soon as I removed them from GAC all worked ok!
回答4:
This is a common error which is caused by not all files being present in the output directory (bin\Debug or bin\Release, depending on which configuration you are running in Visual Studio). CefSharp.dll
is a .NET-based DLL which is dependent on other .dll files, which in turn depends further on other .dll and other files...
Here is a listing of the minimum required files:
- libcef.dll (The core Chromium DLL, which basically contains the web
browser + the CEF embeddability interface which we depend on)
- icudt.dll (Unicode DLL for Chromium, must also be present)
- CefSharp.dll (managed .NET assembly which contains the core CefSharp
functionality)
- CefSharp.WinForms.dll OR CefSharp.WPF.dll (depending on your project
type)
Check this link for more details
回答5:
You have to set the 'copy to output' properties of the files to 'copy always' or 'copy if newer'.
This copies all the files to the output directory, as stated by Coder.
回答6:
In my case, I was following the steps outlined in CefSharp - Our Code World.
Instead of following step A and adding CefSharpAnyCpuSupport
in csproj
and probing
in App.config
, simply setting the Platform Target
to x86
in step B did the trick.
回答7:
The recommended way seems to be to use the NuGet package. Even then you need to make some non-intuitive changes but they are documented. When installing the package freshly a readme.txt file opens with most common issues.
In my case I was missing (x64 also available)
<probing privatePath="x86" />
My App.config looks like this (with CommonServiceLocator in it, ignore that part if you don't have it)
<?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>
The error occurs because there is really no Cefsharp DLL in the bin folder when you set the project to AnyCPU. But in the x86 and x64 folder bellow where you are probing when adding this line the DLL exists. A temporary fix would be to copy the contents from /bin/x86 to /bin.
If AnyCpu is desired CefSharpAnyCpuSupport needs to be added to csproj file. The project Flag for Prefer 32bit needs to be set.
回答8:
Setting "msvcp120.dll" and "msvcr120.dll" to "Copy Always" helped me.