J'essaie de générer un PDF à partir de la base de données du serveur html sql en utilisant la bibliothèque DinkToPdf .
Dans le fichier de démarrage, j'ai ajouté
var context = new CustomAssemblyLoadContext(); context.LoadUnmanagedLibrary(Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll"));
La ligne me donne une erreur lors du lancement de l'application Web
DllNotFoundException: impossible de charger la DLL «C: \ Program Files \ IIS Express \ libwkhtmltox.dll» ou l'une de ses dépendances: le module spécifié est introuvable. (Exception de HRESULT: 0x8007007E)
System.Runtime.Loader.AssemblyLoadContext.InternalLoadUnmanagedDllFromPath (chaîne unmanagedDllPath)
DllNotFoundException: impossible de charger la DLL «C: \ Program Files \ IIS Express \ libwkhtmltox.dll» ou l'une de ses dépendances: le module spécifié est introuvable. (Exception de HRESULT: 0x8007007E)
Veuillez aider partout où vous le pouvez
4 Réponses :
J'ai trouvé des solutions de contournement. Ils ne sont pas parfaits mais valent la peine d'être essayés, et ils ont aidé et j'ai pu générer des PDF à partir de SQl Server. J'ai mis les fichiers .dll dans le dossier suivant et cela a fonctionné.
C: \ Program Files \ IIS Express
et les fichiers .dll chargés avec
Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll");
L'autre façon dont je suis allé pour tout le chemin
context.LoadUnmanagedLibrary(Path.GetFullPath(@"C:\Users\User\source\repos\WebSolution\WebApp\libwkhtmltox.dll"));
Cela fonctionne localement, cependant lorsque je publie sur Azure, une erreur s'est produite.
Et mac. ?
Juste au cas où quelqu'un d'autre aurait le même problème, j'ai pu le résoudre en installant Microsoft Visual C ++ 2015 Redistributable.
J'ai eu un problème similaire lors du chargement d'une dll 32 bits héritée dans un environnement UAT. Le redistribuable C ++ 2010 a fonctionné pour cette DLL particulière.
Il est mentionné dans le dépôt git de la bibliothèque que vous devez télécharger les binaires et les inclure dans votre code source:
Copiez la bibliothèque native dans le dossier racine de votre projet. À partir de là, .NET Core charge la bibliothèque native lorsque la méthode native est appelée avec P / Invoke. Vous pouvez trouver la dernière version de la bibliothèque native ici . Sélectionnez la bibliothèque appropriée pour votre système d'exploitation et votre plate-forme (64 ou 32 bits).
Ce qui a cassé les choses, c'est que j'allais à cette URL et faisais un clic droit sur chaque fichier et sélectionnez enregistrer le lien sous
(chrome). Cela conduit au téléchargement d'un fichier cassé:
NE FAITES PAS CELA
vous devez ouvrir chaque fichier dans github puis utiliser ce bouton Télécharger
.
Le fichier sain est beaucoup plus volumineux que ce que vous obtiendriez si vous vous trompiez!
ridicule mais le problème peut être causé par ça ...
Sur l'application Asp.Net Core, je l'utilise comme ceci pour obtenir le répertoire courant sur le runtime
#if DEBUG //windows string filePath = $@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\libwkhtmltox.dll"; #else //linux string filePath = @$"{(($@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}/libwkhtmltox.so").Replace(@"\", @"/"))}"; #endif CustomAssemblyLoadContext context = new CustomAssemblyLoadContext(); context.LoadUnmanagedLibrary(filePath); serviceCollection.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools())); #endregion
Je recommanderais plutôt d'utiliser System.Runtime.InteropServices.RuntimeInformation.IsOSPlatfo rm (), vérifiez si la plate-forme est Windows ou Linux et définissez le chemin approprié. De cette façon, Debug ne sera pas lié à Linux.
Est-ce que c'est juste si vous importez dinktopdf en utilisant nuget? au lieu de le charger directement comme non géré?
Bonjour, j'ai importé. Je l'ai bien installé. Dans sa description d'utilisation, je dois importer les fichiers dll de la course. Mais cette méthode Directory.GetCurrentDirectory () semble ne pas parier fonctionner sur Asp.Net Core 3.0
Asp.Net Core Directory.GetCurrentDirectory () Je pense que c'est le coupable ici. Il renvoie C: \ Program Files \ IIS Express \ comme dossier par défaut pour le projet