允许 PDFium 支持 x86 和 x64

Allow PDFium to support x86 and x64

我构建了一个使用 PDFium 打印 PDF 文档的 WinForms 应用程序。我从 NuGet 安装了 PDFium,它在我的项目中创建了两个子文件夹 - x86 和 x64 - 正如预期的那样,每个子文件夹里面都有 pdfium.dll 的相关版本。我的应用程序的目标平台设置为 Any CPU.

当我 运行 在我的 Windows 10 64 位机器上调试应用程序时,它运行良好。但是,当我发布应用程序并在同一台计算机上真正安装它时,PDFium 抛出异常:

System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

经过一番研究,我将应用程序的目标平台更改为 x86,并从我的项目中删除了 x64 子文件夹。应用发布后完美运行,问题解决

但是,我想知道是否有一种方法可以让我的应用程序工作,以便它支持 x86 和 x64,使用适合目标计算机的 PDFium 版本。如果它能在可以支持它的机器上安装 64 位版本就好了(这是我们组织中的大多数机器,但我觉得如果我必须选择一个或另一个,以确保兼容性)。

我用过这种方法。主要思路是判断程序在 32 位还是 64 位环境下是运行。这是通过检查指针的大小来完成的。根据此检查的结果,库 pdfium.dll 从应用程序路径的 x86x64 子目录动态加载。

private static bool TryLoadNativeLibrary(string path)
{
    if (path == null)
        return false;

    path = Path.Combine(path, IntPtr.Size == 4 ? "x86" : "x64");

    path = Path.Combine(path, "pdfium.dll");

    return File.Exists(path) && LoadLibrary(path) != IntPtr.Zero;
}

[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);

事实证明这与 PDFium 无关。在我安装已发布应用程序期间使用的脚本中,pdfium.dll 的两个版本都设置为发布到应用程序的根文件夹,而不是名为 x32 和 x64 的子文件夹。结果,在安装过程中,x32 版本的 dll 覆盖了 x64 版本,导致应用程序根本没有 x64 dll。