Skip to content

C# 无法加载 DLL “wkhtmltox.dll”: 找不到指定的模块。

🏷️ C#

线上的问题:

txt
System.Web.HttpUnhandledException (0x80004005): 引发类型为“System.Web.HttpUnhandledException”的异常。 ---> System.DllNotFoundException: 无法加载 DLL“wkhtmltox.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

Server stack trace:
   在 TuesPechkin.WkhtmltoxBindings.wkhtmltopdf_init(Int32 useGraphics)
   在 TuesPechkin.PdfToolset.Load(IDeployment deployment)
   在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object args, Object server, Object& outArgs)
   在 System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]:
   在 TuesPechkin.ThreadSafeConverter.Invoke[TResult](FuncShim`1 delegate)

好像是有的时候能正确生成 PDF,有时候不行。

服务器中也有对应的 dll。

不知道为啥。

_converter 的实例化代码如下:

cs
_converter =
    new ThreadSafeConverter(
        new RemotingToolset<PdfToolset>(
            new Win64EmbeddedDeployment(
                new TempFolderDeployment())));

相关链接:

  1. http://stackoverflow.com/questions/27882601/tuespechkin-unable-to-load-dll-wkhtmltox-dll

  2. https://github.com/tuespetre/TuesPechkin


经测试,第一次调用时会编译生成该“wkhtmltox.dll”,路径是根据当前 AppDomain 的根目录的 hashcode 再加上版本号等。

如:C:\Users\username\AppData\Local\Temp\62005745\8\0.12.2.1

源代码如下:

cs
public TempFolderDeployment()
{
    // Scope it to the application
    Path = System.IO.Path.Combine(
        System.IO.Path.GetTempPath(),
        AppDomain.CurrentDomain.BaseDirectory.GetHashCode().ToString());

    // Scope it by bitness, too
    Path = System.IO.Path.Combine(
        Path,
        IntPtr.Size.ToString());
}

在该 dll 文件生成之后且未被程序加载之前删除该文件,就会出现该异常。