【问题标题】:Allow PDFium to support x86 and x64允许 PDFium 支持 x86 和 x64
【发布时间】:2017-08-20 04:11:17
【问题描述】:

我已经构建了一个使用 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 位版本会很好(这是我们组织中的大多数,但我觉得如果我必须选择一个或另一个,以确保兼容性)。

【问题讨论】:

  • 通过查看库(至少是较新的),如果您保留它建议的目录结构(两个子文件夹,x86 和 x64),它应该在您调用 @987654324 时正确加载所需的版本@
  • 我没有调用 PdfCommon.Initialize()。我想知道你是否在看与我不同的图书馆?我指的是这个项目github.com/pvginkel/PdfiumViewer。我看到 Patagames 有一个名称相似的名称,看起来相关但不相同。或者我可能完全糊涂了。
  • 我在看this。但即使在 github 上,in this lines 也有对 x86/x64 的处理,这正是 rboe 发布的代码
  • 您是否安装在非 ASCII 字符的文件夹中?因为编写该代码的人应该接受关于 Unicode 的速成课程……他使用的是 Ansi 版本的 LoadLibrary 而不是 Unicode 版本。
  • @xanatos 不,我将它安装在没有非 ascii 字符的 Program Files 的子文件夹中。但是,您的问题使我找到了解决此问题的方法,因为在检查安装应用程序的路径时,我注意到 pdfium.dll 文件位于已安装应用程序文件夹的根目录中,而不是 x64 子文件夹。在安装过程中,我的脚本用 x32 版本覆盖了 x64 版本的 pdfium.dll。

标签: c# winforms pdfium


【解决方案1】:

我使用过这种方法。主要思想是确定程序是在 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);

【讨论】:

  • 请务必注意,TryLoadNativeLibrary 必须在程序中的第一个可能点完成,以确保它尚未加载。
  • 这看起来很有希望。我已经对此进行了一些研究,并且遇到了这个答案-我想知道这是否是检查主机环境的更好方法? stackoverflow.com/a/24297692
  • @PhilipStratford 等同于检查IntPtr.SizeIs64BitProcess 也许第二个要快一些...但是我们说的是0和0.0之间的差异:-)
  • 这适用于x86x64Any CPU。在 Windows 10 上测试。您可能需要add some additional nuget packages
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多