允许PDFium支持x86和x64

3
我建立了一个WinForms应用程序,使用PDFium打印PDF文档。我从NuGet安装了PDFium,它在我的项目中创建了两个子文件夹-x86和x64-如预期的那样,每个子文件夹里都有相应版本的pdfium.dll。我的应用程序目标平台设置为“任何CPU”。
当我在Windows 10 64位机器上以调试模式运行应用程序时,它完美地工作。但是,当我发布应用程序并在同一台计算机上实际安装时,PDFium会抛出异常:
"System.BadImageFormatException:尝试加载格式不正确的程序。(HRESULT异常:0x8007000B)"
经过一些研究,我将应用程序的目标平台更改为x86,并从我的项目中删除了x64子文件夹。现在,应用程序在发布后完美地工作,问题得到解决。
然而,我想知道是否有一种方法可以使我的应用程序支持x86和x64,并使用适用于目标计算机的适当版本的PDFium。如果能够在支持64位的机器上安装64位版本就更好了(我们组织内的大多数机器都支持64位,但如果必须选择其中之一,我感到需要选择32位以确保兼容性)。

通过查看库(至少是更新版本),如果您保留它建议的目录结构(两个子文件夹,x86和x64),那么当您调用 PdfCommon.Initialize() 时,应该能够正确加载所需版本。 - xanatos
我没有调用PdfCommon.Initialize()。我想知道你是否在看与我不同的库?我指的是这个项目https://github.com/pvginkel/PdfiumViewer。我看到有一个名字类似的Patagames,似乎相关但不完全相同。或者我可能完全搞混了。 - Philip Stratford
我正在查看 这里。但是即使在GitHub上,在这些行中,也有针对x86/x64的处理,这恰好是rboe发布的代码。 - xanatos
@xanatos 很好的观点。但是,对我来说似乎不起作用。尽管如我在原始问题中所说,它在调试时运行良好,但在实际发布和安装时却无法正常工作。我的项目中的发布和调试配置是相同的。我不明白为什么! - Philip Stratford
1
你是在安装一个包含非ASCII字符的文件夹中吗?因为那个编写代码的人应该接受一次Unicode崩溃课程...他正在使用Ansi版本的LoadLibrary而不是Unicode版本。 - xanatos
1
@xanatos 不,我正在将它安装在Program Files的子文件夹中,没有非ASCII字符。然而,你的问题让我想到了解决这个问题的方法,因为当我检查应用程序被安装的路径时,我注意到pdfium.dll文件在安装的应用程序文件夹的根目录下,而不是x64子文件夹中。在安装过程中,我的脚本正在用x32版本覆盖x64版本的pdfium.dll。 - Philip Stratford
2个回答

8

我曾经使用过这种方法。其主要思路是确定程序是否运行在32位或64位环境中。这可以通过检查指针大小来实现。根据此检查的结果,从应用程序路径的x86x64子目录动态加载库pdfium.dll

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

需要注意的是,TryLoadNativeLibrary必须在程序的尽可能早的阶段完成,以确保它尚未被加载。 - xanatos
这看起来很有前途。我已经对此进行了一些研究,并找到了这个答案 - 我想知道这是否是检查主机环境的更好方法?https://dev59.com/hYDba4cB1Zd3GeqPIcX5#24297692 - Philip Stratford
@PhilipStratford 等价于检查 IntPtr.SizeIs64BitProcess。也许第二个稍微快一点...但我们说的是0和0.0之间的差异 :-) - xanatos
这适用于 x86x64Any CPU。在 Windows 10 上测试过。您可能需要添加一些额外的NuGet包 - clamchoda

1
这实际上与PDFium无关。在发布应用程序时使用的脚本中,pdfium.dll的两个版本都被设置为发布到应用程序的根目录,而不是名为x32和x64的子文件夹中。因此,在安装过程中,dll的x32版本覆盖了x64版本,导致应用程序根本没有x64 dll。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接