J'essaie d'utiliser CefSharp pour charger mon application Web dans WinFoms. J'ai ajouté 2 fichiers dll: CefSharp.dll et CefSharp.WinForms dans les références et ajouter 2 fichiers dll, icudt.dll et libcef.dll dans mon projet en ajoutant des éléments existants.
et ceci est le code du formulaire
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());
}
Quand j'ai lancé l'application, j'ai eu cette erreur
Une exception non gérée du type 'System.IO.FileLoadException' s'est produite dans WindowsFormsApplication1.exe Informations complémentaires: Impossible de charger le fichier ou l'assembly 'CefSharp.dll' ou l'une de ses dépendances. Une bibliothèque de liens dynamiques La routine d'initialisation (DLL) a échoué. (Exception de HRESULT: 0x8007045A)
Donc, tous ceux qui sont au courant, aidez-moi, merci
Vous devez mettre ces fichiers
libcef.dll
icudtl.dat
CefSharp.dll
CefSharp.WinForms.dll
dans votre bin\Debug (ou bin\Release base sur votre configuration)
Et s'il vous plaît n'oubliez pas d'installer Visual C++ 2012 Redistribution (Visual C++ 2013 Redistribuable depuis la version 43), si vous ne le faites pas, Visual Studio affichera toujours une exception, indiquez que CefSharp.dll n'a pas été trouvé bien que vous l'ayez déjà. l'avoir!
J'espère que cette aide.
Je viens d'avoir des problèmes avec cela aussi et j'ai fait ce qui suit:
ajouté le code suivant au démarrage pour s'assurer que toutes les dépendances sont présentes
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
n'a rien signalé manquant, mais dès que j'ai appelé new CefSharp.Wpf.ChromiumWebBrowser()
, une exception s'est produite.
J'ai vérifié toutes les dlls CEF ms.net à l'aide de ILSpy et constaté que certaines de ces DLL étaient également situées dans le GAC. Dès que je les ai retirés du GAC, tout a bien fonctionné!
Ceci est un problème courant et est donc mentionné dans la FAQ , question numéro 3.
@AcccessDenied a raison. Les fichiers doivent être présents dans votre dossier de sortie (bin\Debug ou bin\Release). Une façon de procéder consiste à utiliser une action Post-Build
, qui peut être définie dans les paramètres du projet dans Visual Studio.
Vous pouvez également configurer la post-génération dans le fichier .csproj
, un peu comme ceci:
<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>
(Cet exemple provient du CefSharp.Wpf.Example project du code source de CefSharp, branche CefSharp3. Les emplacements de fichiers exacts peuvent varier dans votre cas, en particulier si vous utilisez CefSharp1, donc adaptez-le selon vos besoins pour garantir les fichiers. être copié correctement.)
Je ne recommande pas de placer des éléments dans bin\Debug ou bin\Release et de les ajouter à la solution à l'aide de Copy Always
. Cela ressemble à un kludge pour moi.
Il s'agit d'une erreur courante due à la non présence de tous les fichiers dans le répertoire de sortie (bin\Debug ou bin\Release, selon la configuration que vous exécutez dans Visual Studio). CefSharp.dll
est un DLL basé sur .NET qui dépend d'autres fichiers .dll, qui dépend ensuite d'autres fichiers .dll et autres ...
Voici une liste des fichiers minimum requis:
Vous devez définir les propriétés "Copier vers la sortie" des fichiers sur "Copier toujours" ou "Copier si récent" . Ceci copie tous les fichiers dans le répertoire de sortie, comme indiqué par Coder.
Dans mon cas, je suivais les étapes décrites dans CefSharp - Notre code monde .
Au lieu de suivre l’étape A et d’ajouter CefSharpAnyCpuSupport
dans csproj
et probing
dans App.config
, définissez simplement Platform Target
sur x86
à l’étape B.
La méthode recommandée semble être d'utiliser le paquet NuGet. Même dans ce cas, vous devez apporter des modifications non intuitives, mais elles sont documentées. Lors de l'installation du package, un fichier readme.txt s'ouvre avec les problèmes les plus courants.
Dans mon cas, il me manquait (x64 également disponible)
<probing privatePath="x86" />
Mon App.config ressemble à ceci (avec CommonServiceLocator dedans, ignorez cette partie si vous ne l'avez pas)
<?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>
L'erreur se produit car il n'y a vraiment pas de fichier Cefsharp DLL dans le dossier bin lorsque vous définissez le projet sur AnyCPU. Mais dans les dossiers ci-dessous x86 et x64 où vous testez lors de l'ajout de cette ligne, le DLL existe. Un correctif temporaire consisterait à copier le contenu de/bin/x86 dans/bin.
Si AnyCpu est souhaité, CefSharpAnyCpuSupport doit être ajouté au fichier csproj. L’indicateur de projet pour Prefer 32bit doit être défini.