3
votes

DinkToPdf Net Core ne peut pas charger les fichiers DLL

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


3 commentaires

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


4 Réponses :


1
votes

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"));


2 commentaires

Cela fonctionne localement, cependant lorsque je publie sur Azure, une erreur s'est produite.


Et mac. ?



7
votes

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.


1 commentaires

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.



2
votes

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é: entrez la description de l'image ici

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!

 entrez la description de l'image ici

ridicule mais le problème peut être causé par ça ...


0 commentaires

1
votes

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


1 commentaires

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.