DinkToPdf Net Core 无法加载 DLL 文件

DinkToPdf Net Core not able to load DLL files

我正在尝试使用 DinkToPdf 库从 HTML SQL 服务器数据库生成 PDF。

在我添加的启动文件中:

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

该行在启动网络应用程序时给我这个错误:

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)

我找到了一些解决方法。它们并不完美,但值得一试,它们确实提供了帮助,我能够从 SQl 服务器生成 PDF。我将 .dll 文件放在以下文件夹中并且它有效。

C:\Program Files\IIS Express

并使用

加载了 .dll 文件
Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll");

整个路径我走的另一条路

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

他们都成功了。但是,我敦促 Net Core 开发人员在 GetCurrentDir 上好好工作。或从项目或解决方案文件夹加载的方法

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

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

库的 git 存储库中提到您应该下载二进制文件并将它们包含在您的源代码中:

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).

破坏性的是我要去 url 并右键单击每个文件和 select save link as(chrome)。这会导致下载损坏的文件:

不要那样做 您必须打开 github 中的每个文件,然后使用 Download 按钮。 健康文件比走错路得到的文件大得多!

荒谬,但问题可能是由这个引起的...

在 Asp.Net 核心应用程序上 我像这样使用它来获取运行时的当前目录

#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

如果您在 Linux 上使用 asp.net 核心,那么您需要使用以下命令安装所需的软件包

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