简体   繁体   中英

DinkToPdf Net Core not able to load DLL files

I am trying to generate PDFs from HTML SQL server database using DinkToPdf library.

In the startup file I have added:

var context = new CustomAssemblyLoadContext();
context.LoadUnmanagedLibrary(Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll"));

The line gives me this error on launching the web app:

DllNotFoundException: Unable to load DLL 'C:\\Program Files\\IIS Express\\libwkhtmltox.dll' or one of its dependencies: The specified module could not be found. (Exception from HRESULT: 0x8007007E)

System.Runtime.Loader.AssemblyLoadContext.InternalLoadUnmanagedDllFromPath(string unmanagedDllPath)

DllNotFoundException: Unable to load DLL 'C:\\Program Files\\IIS Express\\libwkhtmltox.dll' or one of its dependencies: The specified module could not be found. (Exception from HRESULT: 0x8007007E)

以防万一其他人遇到同样的问题,我可以通过安装 Microsoft Visual C++ 2015 Redistributable 来解决它。

It is mentioned in library's git repo that you should download binaries and include them in your source code:

Copy native library to root folder of your project. From there .NET Core loads native library when native method is called with P/Invoke. You can find latest version of native library here . Select appropriate library for your OS and platform (64 or 32 bit).

What was breaking things was that I was going to that url and right click on each file and select save link as (chrome). This leads to a broken file being downloaded: 在此处输入图片说明

DON'T DO THAT you have to open each file within github and then use that Download button. The healthy file is much bigger than what you would get if you go the wrong way!

在此处输入图片说明

ridiculous but the problem may be caused by this ...

I found some work-arounds. They are not perfect but worth a try, and they did do help and I was able to generate PDFs from SQl Server. I put the .dll files in the following folder and it worked.

C:\\Program Files\\IIS Express

and the loaded the .dll files with

Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll");

The other way I went for the whole Path

context.LoadUnmanagedLibrary(Path.GetFullPath(@"C:\Users\User\source\repos\WebSolution\WebApp\libwkhtmltox.dll"));

Both of them worked. However, I urge Net Core developers to work on the GetCurrentDir very well. Or a Method to load from the Project or Solution Folder

Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll");

On Asp.Net Core application I use it like this to get the current directory on 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

Same problem. Works locally, but not after publishing to Azure. Directory.GetCurrentDirectory() works and shows the root of the app (D:\\home\\site\\wwwroot) and File libwkhtmltox.dll exists on the server... Anyone have found the solution?

if you are using asp.net core on Linux then you need to install required packages by using following command

apt-get update \
&& apt-get install -y --no-install-recommends \
    zlib1g \
    fontconfig \
    libfreetype6 \
    libx11-6 \
    libxext6 \
    libxrender1 \
&& curl -o /usr/lib/libwkhtmltox.so \
    --location \
    https://github.com/rdvojmoc/DinkToPdf/raw/v1.0.8/v0.12.4/64%20bit/libwkhtmltox.so

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM