3

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

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

System.BadImageFormatException:试图加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)

在做了一些研究之后,我将应用程序的目标平台更改为 x86,并从我的项目中删除了 x64 子文件夹。该应用程序现在发布后可以完美运行,因此问题解决了。

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

4

2 回答 2

8

我已经使用了这种方法。主要思想是确定程序是在 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);
于 2017-03-27T12:42:58.303 回答
0

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

于 2017-03-27T13:47:03.087 回答